目前,隨著移動應(yīng)用的泛社交化,移動即時通訊(IM)第三方服務(wù)被越來越多開發(fā)者所接受。對于這類服務(wù),功能和穩(wěn)定性是開發(fā)者關(guān)注的重點,但在此之外,性能和體驗也是非常重要的因素。InfoQ 記者對融云技術(shù)副總裁楊威進(jìn)行采訪,探討了移動 IM 服務(wù)如何做到性能和體驗上的極致優(yōu)化。
受訪嘉賓介紹:
楊威,融云技術(shù)副總裁,移動通信技術(shù)專家,智能終端軟件研發(fā)專家。北京郵電大學(xué)通信工程系學(xué)士和碩士學(xué)位,長期從事智能移動終端上的軟件開發(fā)工作,曾在三 星中國通信研究院工作八年。曾負(fù)責(zé)第三方軟件的本地化開發(fā)工作,如高德導(dǎo)航等軟件在全部中國三星終端上的商業(yè)化過程。曾作為項目經(jīng)理領(lǐng)導(dǎo)了包括 Galaxy Note 在內(nèi)等多款商業(yè)智能終端的研發(fā)和商業(yè)化項目工作。作為三星融合通信/RCS產(chǎn)品線研發(fā)總負(fù)責(zé)人和技術(shù)專家,參與了中國移動融合通信產(chǎn)品規(guī)范的整體設(shè)計,帶領(lǐng)團(tuán)隊設(shè)計了三星 RCS、VoIP/VoLTE 產(chǎn)品線的軟件架構(gòu),并負(fù)責(zé)研發(fā)和團(tuán)隊管理工作。
InfoQ:請介紹一下融云在哪些方面做了性能和體驗優(yōu)化?是否設(shè)立了性能指標(biāo)?
楊威:因為融云提供的是面向開發(fā)者的云服務(wù),我們十分重視性能和用戶體驗。我們在提供即時通訊服務(wù)上有三個 基本原則:節(jié)省客戶的資源,讓客戶可擴(kuò)展和可定制,和提供盡量好的功能質(zhì)量。根據(jù)這三個原則我們其實是有一些指標(biāo)的,我們內(nèi)部比較關(guān)注5個性能指標(biāo),分別 是流量、電量、速度、質(zhì)量和包大小。
不過,在很多時候這些指標(biāo)之間其實是互相矛盾或者沖突的,所以需要權(quán)衡,不可能在每一個方面都做到完美。
InfoQ:目前市面上比較主流的通訊協(xié)議有哪些?融云在通訊協(xié)議方面做了哪些優(yōu)化,和業(yè)界主流或標(biāo)準(zhǔn)相比有哪些優(yōu)勢?
楊威:對于通訊協(xié)議,可能不了解的人覺得它很神秘,但像我們這種整天面對它們的人覺得并沒有什么特別的地方。用通俗的話來講,就是兩者之間制定一條規(guī)則,然后遵守這個規(guī)則我把一個東西傳給你,你確認(rèn)收到了,這個規(guī)則就是通訊協(xié)議。在通信、電信行業(yè)里,比較常 用的 IM 協(xié)議可以舉三個例子:
第一類常用的是 SIP/SIMPLE 等協(xié)議,這個在電信網(wǎng)絡(luò)用的比較多,包括全球運(yùn)營商都在推廣的下一代融合通信。這類協(xié)議的特點是非常健壯, 但是規(guī)范非常復(fù)雜,光是看英文規(guī)范文檔可能就要學(xué)習(xí)一兩年,它能夠讓信息在通信節(jié)點之間傳輸?shù)玫胶芎玫陌踩U希浅8叩幕ネㄐ,擴(kuò)展性,同時在私有部署 的時候也可裁剪,所以實際上現(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è)計的一套協(xié)議,基于 XML 協(xié)議,是可擴(kuò)展的,所以理論上你可以將它擴(kuò)展和配置成你想要的業(yè)務(wù)。但是,XMPP 協(xié)議是基于互聯(lián)網(wǎng)早期標(biāo)準(zhǔn)所衍生的,所以它在某些特性上是不適合 移動端的,更適合于 PC 端,比如它的數(shù)據(jù)包比較大,另外在斷線重連上做的也不夠好。一般來講,我還是推薦初學(xué)者用 XMPP 來搭建系統(tǒng),因為有非常豐富的開 源資源,但往往在一段時間之后你會發(fā)現(xiàn)進(jìn)入瓶頸,比如丟消息,延遲響應(yīng)慢等等,根源還在于 XMPP 機(jī)制上更多的還是考慮了穩(wěn)定的網(wǎng)絡(luò)環(huán)境設(shè)計的。XMPP 雖然是開源的軟件,開源代表免費,但開源不代表不需要花時間,很多時候為了解決一個小小的問題,你必須通讀它的源代碼,你才知道問題出在哪里,如何解決。 我們接觸了很多客戶,都是因為解決不了開源協(xié)議帶來的復(fù)雜問題而重新改變了方案。
第三類常用是物聯(lián)網(wǎng)協(xié)議,比如目前比較知名的 MQTT 協(xié)議,這是 IBM 開發(fā)的一款支持多平臺的,非常節(jié)省資源的一套通信協(xié)議。這類協(xié)議的特點就是預(yù)設(shè)場景很簡單,發(fā)送和接收信息都是一次,報文盡量簡短。融云在設(shè)計自己的協(xié)議 的時候參考了物聯(lián)網(wǎng)協(xié)議,當(dāng)然,我們也參考了其他業(yè)界比較優(yōu)秀的協(xié)議,比如我們還要發(fā)送圖片、多媒體內(nèi)容,所以加了很多自己的業(yè)務(wù)模型在基本協(xié)議里。
這第三類例子,其實代表的是業(yè)內(nèi)很大一部分的通訊協(xié)議,即各個公司私有定制的通信協(xié)議,從互聯(lián)網(wǎng)早期的雅虎,MSN,到移動互聯(lián)網(wǎng)時代的微信, 它們其實都是私有協(xié)議。這些私有協(xié)議支撐的是一種 OTT 業(yè)務(wù),跨過電信運(yùn)營商來提供即時通訊服務(wù)。移動互聯(lián)網(wǎng)時代,App 開發(fā)者和他們的用戶們其實并不需 要關(guān)心底層是怎么實現(xiàn)的,只要一個用戶能和另一個用戶發(fā)送信息就可以,對于這樣的場景,其實根據(jù)它們的需求定制一套私有協(xié)議是最好的,事實上,這也是即時通訊(軟件)領(lǐng)域主流甚至唯一的實現(xiàn)方法。
InfoQ:你們在省電上做了哪些優(yōu)化?
楊威:省電也是開發(fā)者和用戶比較關(guān)心的問題,特別是安卓平臺。電量問題分為兩類,一類是前臺耗電,就是應(yīng)用 啟動時消耗的電量,另一類是后臺耗電,就是應(yīng)用被關(guān)閉或屏幕熄滅時候的耗電。前臺耗電的主要指標(biāo)是:1)流量,2)內(nèi)存,3)方法。第一在手機(jī)上,當(dāng)我們 在使用數(shù)據(jù)網(wǎng)絡(luò)傳輸時的耗電量是使用Wi-Fi或者不使用網(wǎng)絡(luò)時候的幾倍到上百倍之間,因為通信芯片的功耗是非常高的,所以減小流量就是減小電量的消耗, 同時還有減少通信次數(shù),同樣的留言,發(fā)送兩次和發(fā)送一次,電量消耗其實差別很大;第二就是內(nèi)存,盡量不使用壓縮算法和其他消耗內(nèi)存大的方法,消耗內(nèi)存越 大,使用內(nèi)存越頻繁,耗電量也越高。這里提到壓縮算法,其實就是指標(biāo)沖突的一個例子,像你用壓縮算法將內(nèi)容體積減少一半,流量減少一半,但是使用內(nèi)存多 了,增加了耗電量,這是個度的問題,如何選擇,需要反復(fù)的測試和調(diào)整。因為我們傳輸?shù)臄?shù)據(jù)本來就是二進(jìn)制數(shù)據(jù),壓縮作用不大,所以選擇不壓縮。最后就是流 程問題,不必要的操作和數(shù)據(jù)會加大耗電量。在序列化和反序列化方面我們使用 JSON 和 protobuffer,這是谷歌官方推薦的省流量省內(nèi)存的方法,當(dāng) 然這也是業(yè)內(nèi)比較通用的方案。
還有后臺耗電,IM 類服務(wù)在后臺時為了保持長連接,需要向服務(wù)端發(fā)送心跳包。這里我們除了做了減少心跳包大小這樣常規(guī)的優(yōu)化以外,還做了智能心 跳的優(yōu)化,在不同的網(wǎng)絡(luò)條件下發(fā)送心跳的間隔時間不同,比如2G連接和響應(yīng)速度慢,會消耗更多的電量。這里面的很多數(shù)據(jù)其實是一種“Magic Number”,因為這是根據(jù)大量的經(jīng)驗和測試數(shù)據(jù)對比,以及內(nèi)部的數(shù)據(jù)得到的,并經(jīng)常調(diào)整。
最后其實很多用戶都有一個誤區(qū),因為安卓手機(jī)比較耗電,其實根據(jù)我們的測試,后臺耗電其實還是遠(yuǎn)遠(yuǎn)小于前臺耗電的。耗電往往是因為手機(jī)軟件有各 種bug。一些開發(fā)者會覺得 IM 類的軟件比較耗電,其實 IM 類的軟件一定是相對最耗電軟件品類,因為你要不斷跟其他人保持通信,如果其他軟件耗電超過了 IM 軟件,那才是問題。之所以大家覺得安卓手機(jī)后臺耗電大的原因,一是因為手機(jī)上不止裝一個 IM 軟件,二是不光IM軟件發(fā)心跳,其實所有的app都在做類 似的事情,融云作為開發(fā)包的提供者,每個版本都會對電量和流量進(jìn)行監(jiān)控和測試,我們對此會比應(yīng)用開發(fā)者付出更多的努力,也會有更強(qiáng)的保證。
InfoQ:你們在快速響應(yīng)和傳輸速度上做了哪些優(yōu)化?
楊威:第一點是數(shù)據(jù)包盡量小,第二點是我們盡量不分包,一次傳輸完所有信息,我們目前服務(wù)的使用場景,用戶發(fā)送的信息往往比較短的,第三點是鏈路盡量短,服務(wù)器對數(shù)據(jù)做完處理后就發(fā)出去,一些阻塞的操作都是異步進(jìn)行的,另外一些比較耗時的處理我們會放到客戶 端,第四點是“先收先發(fā)”,比如說在客戶端,收到消息之后馬上把它展現(xiàn)出來,然后再做其他操作。比如圖片這類收發(fā)比較慢的消息,我們會優(yōu)先展示,然后異步 再收發(fā)。
InfoQ:融云在 SDK 上是否做了多路復(fù)用,安卓后臺服務(wù)如何防殺死?
楊威:多路復(fù)用是肯定的,如果后臺有多個使用我們SDK的應(yīng)用在運(yùn)行,我們可以保證它們同時只使用一個心 跳。另外還有一個方面,就是我們在后臺其實是需要保持兩個通道的,一個是 TCP 的長連接,就是 IM 的,另外還有一個推送的長連接。對于移動 IM 來說,推送 是必須要有的,因為手機(jī)熄屏后其實后臺的服務(wù)已經(jīng)停止工作了,只有推送能夠提醒用戶有新消息。對于這兩個通道,我們也將它合并為一個心跳,只需要一個心跳 就可以保持和服務(wù)端的兩個長連接。另外在前臺,我們的多路復(fù)用使用進(jìn)程池,保證多條消息的收、發(fā)能夠同時進(jìn)行,這些進(jìn)程池在使用后也會回收掉。總之就是, 能少發(fā)出一個心跳消息,我們盡量少發(fā)出去一次,同時還要一定確保通信鏈路的穩(wěn)定。
至于后臺進(jìn)程防殺這是個比較敏感的問題,因為現(xiàn)在用戶不喜歡有一堆進(jìn)程在后臺消耗它的電量,而且國內(nèi)的各個 ROM 廠商也在這方面做了一些工作, 有些應(yīng)用長時間占用系統(tǒng)資源的做法可能會被封禁。以前業(yè)內(nèi)一般常用的做法是做了很多技術(shù)性工作來保證后臺進(jìn)程永遠(yuǎn)殺不死,因為喚醒率對于很多App廠商都 是很重要的評測指標(biāo),把后臺殺死消息就收不到了。不過融云作為一家服務(wù)提供商,我們優(yōu)先還是要對客戶負(fù)責(zé),因此所有的灰色地帶都是不碰的,我們現(xiàn)在的 SDK 默認(rèn)設(shè)置是一定不觸犯系統(tǒng)或者 ROM 廠商的紅線,如果系統(tǒng)一定要殺進(jìn)程還不想你重啟,那我們的后臺就不再啟動,我們一定優(yōu)先遵從手機(jī)操作系統(tǒng)的規(guī) 定,也就是用戶的意愿。
InfoQ:融云用戶目前有哪些使用場景,針對這些場景做過哪些優(yōu)化?
楊威:有用戶對我們總結(jié)說,融云最大的價值就是提供了一個穩(wěn)定的長連接,用這個長連接其實可以干很多事。我 們認(rèn)為融云最大的價值是服務(wù),客戶想到的點子我們可以快速的研發(fā)和實現(xiàn)業(yè)務(wù)。群眾的力量是無窮的,我們的用戶發(fā)掘了很多以前我們從來也想不到的用法。比如 做視頻直播、發(fā)信令(遙控器)、彈幕,還有做像滴滴打車一樣的實時地理位置共享。像微信一樣的聊天界面很容易相信,但很多應(yīng)用場景的界面完全都不是 IM, 但其實他就是 IM。比如滴滴打車的首頁,因為你可以想一下它那個界面,每個車都定時發(fā)送自己的地理位置,然后一起顯示,其實原理和聊天室是一樣的。我們經(jīng) 常和用戶溝通,也為這些場景做了很多優(yōu)化,舉個例子,比如視頻直播的聊天室,我們之前做的比較簡單,就是滿足了收發(fā)信息的需求,但是有些做視頻直播的開發(fā) 者還希望有排隊、進(jìn)場順序等等,對于有些客戶,我們會為它做一個定制版系統(tǒng),有些如果是非常好的建議,我們也會吸收到我們的主系統(tǒng)里面。