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