首頁 > 新聞 > 專家觀點(diǎn) >

專訪融云楊威:移動(dòng)IM服務(wù)如何做到極致優(yōu)化

2015-11-24 10:39:22   作者:   來源:InfoQ   評(píng)論:0  點(diǎn)擊:


  目前,隨著移動(dòng)應(yīng)用的泛社交化,移動(dòng)即時(shí)通訊(IM)第三方服務(wù)被越來越多開發(fā)者所接受。對(duì)于這類服務(wù),功能和穩(wěn)定性是開發(fā)者關(guān)注的重點(diǎn),但在此之外,性能和體驗(yàn)也是非常重要的因素。InfoQ 記者對(duì)融云技術(shù)副總裁楊威進(jìn)行采訪,探討了移動(dòng) IM 服務(wù)如何做到性能和體驗(yàn)上的極致優(yōu)化。

  受訪嘉賓介紹:

  楊威,融云技術(shù)副總裁,移動(dòng)通信技術(shù)專家,智能終端軟件研發(fā)專家。北京郵電大學(xué)通信工程系學(xué)士和碩士學(xué)位,長期從事智能移動(dòng)終端上的軟件開發(fā)工作,曾在三 星中國通信研究院工作八年。曾負(fù)責(zé)第三方軟件的本地化開發(fā)工作,如高德導(dǎo)航等軟件在全部中國三星終端上的商業(yè)化過程。曾作為項(xiàng)目經(jīng)理領(lǐng)導(dǎo)了包括 Galaxy Note 在內(nèi)等多款商業(yè)智能終端的研發(fā)和商業(yè)化項(xiàng)目工作。作為三星融合通信/RCS產(chǎn)品線研發(fā)總負(fù)責(zé)人和技術(shù)專家,參與了中國移動(dòng)融合通信產(chǎn)品規(guī)范的整體設(shè)計(jì),帶領(lǐng)團(tuán)隊(duì)設(shè)計(jì)了三星 RCS、VoIP/VoLTE 產(chǎn)品線的軟件架構(gòu),并負(fù)責(zé)研發(fā)和團(tuán)隊(duì)管理工作。

  InfoQ:請(qǐng)介紹一下融云在哪些方面做了性能和體驗(yàn)優(yōu)化?是否設(shè)立了性能指標(biāo)?

  楊威:因?yàn)槿谠铺峁┑氖敲嫦蜷_發(fā)者的云服務(wù),我們十分重視性能和用戶體驗(yàn)。我們?cè)谔峁┘磿r(shí)通訊服務(wù)上有三個(gè) 基本原則:節(jié)省客戶的資源,讓客戶可擴(kuò)展和可定制,和提供盡量好的功能質(zhì)量。根據(jù)這三個(gè)原則我們其實(shí)是有一些指標(biāo)的,我們內(nèi)部比較關(guān)注5個(gè)性能指標(biāo),分別 是流量、電量、速度、質(zhì)量和包大小。

  不過,在很多時(shí)候這些指標(biāo)之間其實(shí)是互相矛盾或者沖突的,所以需要權(quán)衡,不可能在每一個(gè)方面都做到完美。

  InfoQ:目前市面上比較主流的通訊協(xié)議有哪些?融云在通訊協(xié)議方面做了哪些優(yōu)化,和業(yè)界主流或標(biāo)準(zhǔn)相比有哪些優(yōu)勢(shì)?

  楊威:對(duì)于通訊協(xié)議,可能不了解的人覺得它很神秘,但像我們這種整天面對(duì)它們的人覺得并沒有什么特別的地方。用通俗的話來講,就是兩者之間制定一條規(guī)則,然后遵守這個(gè)規(guī)則我把一個(gè)東西傳給你,你確認(rèn)收到了,這個(gè)規(guī)則就是通訊協(xié)議。在通信、電信行業(yè)里,比較常 用的 IM 協(xié)議可以舉三個(gè)例子:

  第一類常用的是 SIP/SIMPLE 等協(xié)議,這個(gè)在電信網(wǎng)絡(luò)用的比較多,包括全球運(yùn)營商都在推廣的下一代融合通信。這類協(xié)議的特點(diǎn)是非常健壯, 但是規(guī)范非常復(fù)雜,光是看英文規(guī)范文檔可能就要學(xué)習(xí)一兩年,它能夠讓信息在通信節(jié)點(diǎn)之間傳輸?shù)玫胶芎玫陌踩U,非常高的互通行,擴(kuò)展性,同時(shí)在私有部署 的時(shí)候也可裁剪,所以實(shí)際上現(xiàn)在仍然非常多的業(yè)務(wù)在使用這類協(xié)議。

  第二類常用的就是 XMPP 協(xié)議,XMPP 是互聯(lián)網(wǎng)開源標(biāo)準(zhǔn)的典范。常用的還是C/S 架構(gòu)。XMPP 協(xié)議的初衷是為互聯(lián)網(wǎng)設(shè)計(jì)的一套協(xié)議,基于 XML 協(xié)議,是可擴(kuò)展的,所以理論上你可以將它擴(kuò)展和配置成你想要的業(yè)務(wù)。但是,XMPP 協(xié)議是基于互聯(lián)網(wǎng)早期標(biāo)準(zhǔn)所衍生的,所以它在某些特性上是不適合 移動(dòng)端的,更適合于 PC 端,比如它的數(shù)據(jù)包比較大,另外在斷線重連上做的也不夠好。一般來講,我還是推薦初學(xué)者用 XMPP 來搭建系統(tǒng),因?yàn)橛蟹浅XS富的開 源資源,但往往在一段時(shí)間之后你會(huì)發(fā)現(xiàn)進(jìn)入瓶頸,比如丟消息,延遲響應(yīng)慢等等,根源還在于 XMPP 機(jī)制上更多的還是考慮了穩(wěn)定的網(wǎng)絡(luò)環(huán)境設(shè)計(jì)的。XMPP 雖然是開源的軟件,開源代表免費(fèi),但開源不代表不需要花時(shí)間,很多時(shí)候?yàn)榱私鉀Q一個(gè)小小的問題,你必須通讀它的源代碼,你才知道問題出在哪里,如何解決。 我們接觸了很多客戶,都是因?yàn)榻鉀Q不了開源協(xié)議帶來的復(fù)雜問題而重新改變了方案。

  第三類常用是物聯(lián)網(wǎng)協(xié)議,比如目前比較知名的 MQTT 協(xié)議,這是 IBM 開發(fā)的一款支持多平臺(tái)的,非常節(jié)省資源的一套通信協(xié)議。這類協(xié)議的特點(diǎn)就是預(yù)設(shè)場(chǎng)景很簡單,發(fā)送和接收信息都是一次,報(bào)文盡量簡短。融云在設(shè)計(jì)自己的協(xié)議 的時(shí)候參考了物聯(lián)網(wǎng)協(xié)議,當(dāng)然,我們也參考了其他業(yè)界比較優(yōu)秀的協(xié)議,比如我們還要發(fā)送圖片、多媒體內(nèi)容,所以加了很多自己的業(yè)務(wù)模型在基本協(xié)議里。

  這第三類例子,其實(shí)代表的是業(yè)內(nèi)很大一部分的通訊協(xié)議,即各個(gè)公司私有定制的通信協(xié)議,從互聯(lián)網(wǎng)早期的雅虎,MSN,到移動(dòng)互聯(lián)網(wǎng)時(shí)代的微信, 它們其實(shí)都是私有協(xié)議。這些私有協(xié)議支撐的是一種 OTT 業(yè)務(wù),跨過電信運(yùn)營商來提供即時(shí)通訊服務(wù)。移動(dòng)互聯(lián)網(wǎng)時(shí)代,App 開發(fā)者和他們的用戶們其實(shí)并不需 要關(guān)心底層是怎么實(shí)現(xiàn)的,只要一個(gè)用戶能和另一個(gè)用戶發(fā)送信息就可以,對(duì)于這樣的場(chǎng)景,其實(shí)根據(jù)它們的需求定制一套私有協(xié)議是最好的,事實(shí)上,這也是即時(shí)通訊(軟件)領(lǐng)域主流甚至唯一的實(shí)現(xiàn)方法。

  InfoQ:你們?cè)谑‰娚献隽四男﹥?yōu)化?

  楊威:省電也是開發(fā)者和用戶比較關(guān)心的問題,特別是安卓平臺(tái)。電量問題分為兩類,一類是前臺(tái)耗電,就是應(yīng)用 啟動(dòng)時(shí)消耗的電量,另一類是后臺(tái)耗電,就是應(yīng)用被關(guān)閉或屏幕熄滅時(shí)候的耗電。前臺(tái)耗電的主要指標(biāo)是:1)流量,2)內(nèi)存,3)方法。第一在手機(jī)上,當(dāng)我們 在使用數(shù)據(jù)網(wǎng)絡(luò)傳輸時(shí)的耗電量是使用Wi-Fi或者不使用網(wǎng)絡(luò)時(shí)候的幾倍到上百倍之間,因?yàn)橥ㄐ判酒墓氖欠浅8叩,所以減小流量就是減小電量的消耗, 同時(shí)還有減少通信次數(shù),同樣的留言,發(fā)送兩次和發(fā)送一次,電量消耗其實(shí)差別很大;第二就是內(nèi)存,盡量不使用壓縮算法和其他消耗內(nèi)存大的方法,消耗內(nèi)存越 大,使用內(nèi)存越頻繁,耗電量也越高。這里提到壓縮算法,其實(shí)就是指標(biāo)沖突的一個(gè)例子,像你用壓縮算法將內(nèi)容體積減少一半,流量減少一半,但是使用內(nèi)存多 了,增加了耗電量,這是個(gè)度的問題,如何選擇,需要反復(fù)的測(cè)試和調(diào)整。因?yàn)槲覀儌鬏數(shù)臄?shù)據(jù)本來就是二進(jìn)制數(shù)據(jù),壓縮作用不大,所以選擇不壓縮。最后就是流 程問題,不必要的操作和數(shù)據(jù)會(huì)加大耗電量。在序列化和反序列化方面我們使用 JSON 和 protobuffer,這是谷歌官方推薦的省流量省內(nèi)存的方法,當(dāng) 然這也是業(yè)內(nèi)比較通用的方案。

  還有后臺(tái)耗電,IM 類服務(wù)在后臺(tái)時(shí)為了保持長連接,需要向服務(wù)端發(fā)送心跳包。這里我們除了做了減少心跳包大小這樣常規(guī)的優(yōu)化以外,還做了智能心 跳的優(yōu)化,在不同的網(wǎng)絡(luò)條件下發(fā)送心跳的間隔時(shí)間不同,比如2G連接和響應(yīng)速度慢,會(huì)消耗更多的電量。這里面的很多數(shù)據(jù)其實(shí)是一種“Magic Number”,因?yàn)檫@是根據(jù)大量的經(jīng)驗(yàn)和測(cè)試數(shù)據(jù)對(duì)比,以及內(nèi)部的數(shù)據(jù)得到的,并經(jīng)常調(diào)整。

  最后其實(shí)很多用戶都有一個(gè)誤區(qū),因?yàn)榘沧渴謾C(jī)比較耗電,其實(shí)根據(jù)我們的測(cè)試,后臺(tái)耗電其實(shí)還是遠(yuǎn)遠(yuǎn)小于前臺(tái)耗電的。耗電往往是因?yàn)槭謾C(jī)軟件有各 種bug。一些開發(fā)者會(huì)覺得 IM 類的軟件比較耗電,其實(shí) IM 類的軟件一定是相對(duì)最耗電軟件品類,因?yàn)槟阋粩喔渌吮3滞ㄐ,如果其他軟件耗電超過了 IM 軟件,那才是問題。之所以大家覺得安卓手機(jī)后臺(tái)耗電大的原因,一是因?yàn)槭謾C(jī)上不止裝一個(gè) IM 軟件,二是不光IM軟件發(fā)心跳,其實(shí)所有的app都在做類 似的事情,融云作為開發(fā)包的提供者,每個(gè)版本都會(huì)對(duì)電量和流量進(jìn)行監(jiān)控和測(cè)試,我們對(duì)此會(huì)比應(yīng)用開發(fā)者付出更多的努力,也會(huì)有更強(qiáng)的保證。

  InfoQ:你們?cè)诳焖夙憫?yīng)和傳輸速度上做了哪些優(yōu)化?

  楊威:第一點(diǎn)是數(shù)據(jù)包盡量小,第二點(diǎn)是我們盡量不分包,一次傳輸完所有信息,我們目前服務(wù)的使用場(chǎng)景,用戶發(fā)送的信息往往比較短的,第三點(diǎn)是鏈路盡量短,服務(wù)器對(duì)數(shù)據(jù)做完處理后就發(fā)出去,一些阻塞的操作都是異步進(jìn)行的,另外一些比較耗時(shí)的處理我們會(huì)放到客戶 端,第四點(diǎn)是“先收先發(fā)”,比如說在客戶端,收到消息之后馬上把它展現(xiàn)出來,然后再做其他操作。比如圖片這類收發(fā)比較慢的消息,我們會(huì)優(yōu)先展示,然后異步 再收發(fā)。

  InfoQ:融云在 SDK 上是否做了多路復(fù)用,安卓后臺(tái)服務(wù)如何防殺死?

  楊威:多路復(fù)用是肯定的,如果后臺(tái)有多個(gè)使用我們SDK的應(yīng)用在運(yùn)行,我們可以保證它們同時(shí)只使用一個(gè)心 跳。另外還有一個(gè)方面,就是我們?cè)诤笈_(tái)其實(shí)是需要保持兩個(gè)通道的,一個(gè)是 TCP 的長連接,就是 IM 的,另外還有一個(gè)推送的長連接。對(duì)于移動(dòng) IM 來說,推送 是必須要有的,因?yàn)槭謾C(jī)熄屏后其實(shí)后臺(tái)的服務(wù)已經(jīng)停止工作了,只有推送能夠提醒用戶有新消息。對(duì)于這兩個(gè)通道,我們也將它合并為一個(gè)心跳,只需要一個(gè)心跳 就可以保持和服務(wù)端的兩個(gè)長連接。另外在前臺(tái),我們的多路復(fù)用使用進(jìn)程池,保證多條消息的收、發(fā)能夠同時(shí)進(jìn)行,這些進(jìn)程池在使用后也會(huì)回收掉?傊褪, 能少發(fā)出一個(gè)心跳消息,我們盡量少發(fā)出去一次,同時(shí)還要一定確保通信鏈路的穩(wěn)定。

  至于后臺(tái)進(jìn)程防殺這是個(gè)比較敏感的問題,因?yàn)楝F(xiàn)在用戶不喜歡有一堆進(jìn)程在后臺(tái)消耗它的電量,而且國內(nèi)的各個(gè) ROM 廠商也在這方面做了一些工作, 有些應(yīng)用長時(shí)間占用系統(tǒng)資源的做法可能會(huì)被封禁。以前業(yè)內(nèi)一般常用的做法是做了很多技術(shù)性工作來保證后臺(tái)進(jìn)程永遠(yuǎn)殺不死,因?yàn)閱拘崖蕦?duì)于很多App廠商都 是很重要的評(píng)測(cè)指標(biāo),把后臺(tái)殺死消息就收不到了。不過融云作為一家服務(wù)提供商,我們優(yōu)先還是要對(duì)客戶負(fù)責(zé),因此所有的灰色地帶都是不碰的,我們現(xiàn)在的 SDK 默認(rèn)設(shè)置是一定不觸犯系統(tǒng)或者 ROM 廠商的紅線,如果系統(tǒng)一定要?dú)⑦M(jìn)程還不想你重啟,那我們的后臺(tái)就不再啟動(dòng),我們一定優(yōu)先遵從手機(jī)操作系統(tǒng)的規(guī) 定,也就是用戶的意愿。

  InfoQ:融云用戶目前有哪些使用場(chǎng)景,針對(duì)這些場(chǎng)景做過哪些優(yōu)化?

  楊威:有用戶對(duì)我們總結(jié)說,融云最大的價(jià)值就是提供了一個(gè)穩(wěn)定的長連接,用這個(gè)長連接其實(shí)可以干很多事。我 們認(rèn)為融云最大的價(jià)值是服務(wù),客戶想到的點(diǎn)子我們可以快速的研發(fā)和實(shí)現(xiàn)業(yè)務(wù)。群眾的力量是無窮的,我們的用戶發(fā)掘了很多以前我們從來也想不到的用法。比如 做視頻直播、發(fā)信令(遙控器)、彈幕,還有做像滴滴打車一樣的實(shí)時(shí)地理位置共享。像微信一樣的聊天界面很容易相信,但很多應(yīng)用場(chǎng)景的界面完全都不是 IM, 但其實(shí)他就是 IM。比如滴滴打車的首頁,因?yàn)槟憧梢韵胍幌滤莻(gè)界面,每個(gè)車都定時(shí)發(fā)送自己的地理位置,然后一起顯示,其實(shí)原理和聊天室是一樣的。我們經(jīng) 常和用戶溝通,也為這些場(chǎng)景做了很多優(yōu)化,舉個(gè)例子,比如視頻直播的聊天室,我們之前做的比較簡單,就是滿足了收發(fā)信息的需求,但是有些做視頻直播的開發(fā) 者還希望有排隊(duì)、進(jìn)場(chǎng)順序等等,對(duì)于有些客戶,我們會(huì)為它做一個(gè)定制版系統(tǒng),有些如果是非常好的建議,我們也會(huì)吸收到我們的主系統(tǒng)里面。

相關(guān)閱讀:

分享到: 收藏

專題