网易云信深度优化解决移动聊天室“痼疾”
本文源于云信移動技術專家項望烽在開源中國源創會2016年終盛典的題為《聊天室場景下的移動網絡優化》分享。
(網易云信移動端技術 項望烽)
突破傳統群組思維和架構,實現無人數上限的聊天室
步入移動互聯網時代以來,包括IM和聊天室在內,絕大多數相關應用的開發,都經歷了從直接移植桌面端產品到移動端,到如今直接以移動端產品為主導的轉變。而因為移動網絡環境本身的復雜性,期間也不斷遇到了各種難題。以目前覆蓋人群最廣的手機直播為代表的移動端聊天室為例,和常見IM應用不同,它從一個點對點的場景變為了群的場景,建立在群的架構上。如果是在線人數繁多、單位時間內消息量巨大的聊天室場景中,可能僅查詢聊天室成員在線就會讓服務器崩潰。而且還要顧及到本身視頻直播的推位流和觀眾與主播的互動,以及各種復雜數據流的傳輸。這也是為什么常見IM聊天室都有人數上限和離線消息存入限制的原因。而網易云信則突破了傳統群組思維來設計聊天室架構,實現了無上限人數的聊天室。
網易云信的應對之道及優化方向
網易云信會讓無上限人數的聊天室的用戶都連接到相同的一組服務器上,這樣到消息投遞過來的時候,就不需要進行用戶在線狀態的查詢,只需要把消息投遞到相應的幾臺或者幾十臺服務器上即可。但這種情況下,對于移動端的要求更高,等于每一個聊天室移動端都要重建一個TCP連接,又要能夠保障每個直播間或者說每個聊天室都能夠秒進。而且因為聊天室人員的流動性,用戶經常從一個主播切換到另外一個主播,導致聊天室切換,重連也比較頻繁。那么在這種情況下,移動端怎么做優化工作呢?
首先我們可以將一個IM產品或者說一個聊天室場景分為幾個環節:連接服務、登錄、發送消息和接收消息。所謂的網絡優化也就是針對這幾個環節而已,怎么更快的連接服務器,怎么更快更安全的登錄服務器,怎樣保證消息快速抵達和不丟,以及最后一步——怎么優雅的接收消息。
?
雙模式綜合應用,確保連接穩定快速
首先,從連接維度著手。相比起傳統拿一個域名去鏈接服務器并發送請求的方式,云信采用HTTP DNS和內置IP列表兩種模式綜合應用。一方面,用 IM 應用服務器作為一個功能類似lbs的服務器,通過 IM 的長連接獲取聊天室IP地址,獲取后的服務器地址緩存在本地使用。這樣就能夠保證絕大部分的連接都是用 IP 做直連,而且能夠連接到最適合當前客戶端的服務器。同時,在保活保連方面,精簡心跳包,并減少心跳包的頻率。針對重連情況,做一定的退避機制和啟用淘汰機制。如果重連某臺服務器次數超過一定的閾值就嘗試下一臺服務器。
?
多維度優化,為登錄順暢保駕護航
在登錄方面, 網易云信將加密和登錄請求放在一個環節中來完成,不使用公開的協議,而使用私有協議,自定義整個加密流程,去除證書下發和驗證的過程,在保證安全且不容易被破解的前提下,保證能夠最快的完成登錄流程。此外,網易云信還在技術層面對現有協議進行了一系列的精簡。使用二進制協議和壓縮,盡量保證登錄請求包足夠小,減少因為分組帶來的丟包率升高,而導致重傳。此外,在登錄后實現增量同步和按需同步,只有在真正需要的時候才進行信息的獲取。
?
精心打磨文件上傳,實現高效穩定
在純文本信息和指令的發送上,網易云信采用了常見的依靠應用層ACK的模式,把更多的精力放到對文件上傳的優化方面。移動網絡的低帶寬、高延遲、高丟包率導致了普通的上傳非常容易失敗,大量的TCP分組和簡單的分塊上傳,依然容易出現重傳次數過多和較高的失敗率。針對這一問題,網易云信根據網絡類型來預估分塊大小,并進行動態調整,同時為了減少RTT的影響采用Pipelining技術,在一個TCP連接上順序發送多個請求,同時為了提高上傳成功率做一定程度的限速,防止一次發送的數據過載,造成過多的TCP分組。在業務層面,譬如音頻傳輸,則采取邊錄邊傳的模式來達成高效優化。
?
2016年,視頻直播行業迎來了空前的大爆發,而且移動直播客戶端的用戶訪問量也呈現出井噴的趨勢,圍繞多數主播的“同房”觀眾往往數以萬計,大有重現甚至超過當初BBS時代聊天室的盛況。但對于直播平臺或者聊天室的運營者而言,龐大的用戶訪問量引發的卡頓、宕機、崩潰、消息發送和接收不暢,以及移動端弱網絡等問題也成為了無法回避的痛點。網易云信憑借自身多年的技術沉淀及大量全方位的精打細磨,推出了“無人數上限直播聊天室”的解決方案(包括UI組件、P2P 群組、聊天室,而且都是開源),及時為直播行業的蓬勃發展掃清了障礙。
網易云信∣真正穩定的IM云服務
http://netease.im ?長按識別,關注精彩
總結
以上是生活随笔為你收集整理的网易云信深度优化解决移动聊天室“痼疾”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易云信SDK V3.2.0版发布啦!
- 下一篇: 架构设计从这5点考虑,能帮后期运维很大忙