周梁伟:聊天室架构 如何跳出传统思维来设计?
周梁偉?現任網易云信 IM云服務器端開發負責人,浙江大學計算機學院碩士。2011年加入網易,先后擔任網易后臺技術中心與網易大數據平臺資深開發工程師,負責即時通訊領域的產品開發與應用服務器與大數據領域戰略規劃與設計。
下文根據周梁偉在高升云道深圳站演講整理而成。
◆ ?◆ ?◆
網易云信是網易公司推出的一個面向開發者的IM云平臺。今天,結合《性能當道 優化為王》的主題,重點挑選聊天室這個典型場景,和大家分享一下網易云信在實現這個功能時是如何做架構設計的。
常見的虛擬社群
聊天室的應用場景非常廣,除了傳統的圖文聊天外,時下流行的視頻彈幕、在線秀場、在線教育、游戲互動等各式各樣產品中都有類似的應用場景。
在討論聊天室之前,我們先了解下幾種常見的虛擬社群形態。下表從參與人數、消息送達即時性、離線消息關注度等維度對論壇、IM P2P、IM群和聊天室這幾種常見的虛擬社群形態做了簡單對比,從這個對比可以看到聊天室是不同于論壇和群模式的一種虛擬組織,聊天室的架構需要跳出傳統思維來設計。
聊天室跟普通的IM群(微信群,QQ群等)相比最大的不同點在于它是一個比較開放的虛擬組織。我們可以將聊天室比喻成一個廣場,廣場是開放無邊界的,所有的人都可以隨進隨出,而群就像一個房間,是一個有邊界有容量上限的私密組織,并且進入這個房間需要一定條件,一般是主動申請加入或被邀請加入。聊天室對比BBS論壇這種虛擬組織來說,它既具有了IM群消息即時送達的特性又有論壇參與人數無上限的特性。
聊天室關鍵技術和難點
那么,是否能從一個已有的成熟技術框架上改造一個聊天室出來呢?
經過前面的比較我們看到,聊天室和論壇及IM群都具有一定的共性,看起來似乎可以將論壇架構改造成聊天室,也可以將IM群改造成聊天室。
路徑一:將論壇架構改造成聊天室,首先需要提高消息送達的即時性,由于論壇都是基于HTTP協議的,為了保證消息即時送達,需要客戶端不斷輪詢服務器來獲取新的消息,如果對即時性的要求越高,那輪詢的時間就需要縮短,這種模式在用戶量達到一定規模后是無法承載的。為了保證消息的高效送達,客戶端與服務器之間的需要采用長連接機制,新消息的送達通過服務器主動向客戶端下推來完成。
路徑二:將已有的IM群改造成聊天室,由于群具有對離線消息關注度高的特性,所有的群消息在成員離線時需要持久化,因而群人數越多效率越低,也正是因為這個原因,一般的IM群都是有人數上限的,如果想把群改造成聊天室,就不能存離線消息,所以這種方式看起來也不是這么順暢。
現在市場上很多提供聊天室類服務的產品其實都是基于群的模式來實現的,所以人數上限一直是一個難以突破的瓶頸,甚至有的服務直接使用“超大群”或“千人群”這樣一種特殊群模式來滿足用戶對聊天室場景的需求。
下面我們來看下,如果要實現一個人數無上限的聊天室服務,需要解決哪些難題。
首先:客戶端多樣性。近幾年來移動互聯網發展得非常快,現在推出的APP一般都需要同時具備iOS版、安卓版和Web版、PC版等不同的版本,跨平臺的開發需求一直是攔在創業團隊面前的一座大山;
第二:數據安全保障。當前的網絡環境異常復雜,我們的APP在客戶端與服務器之間的數據通信都暴露在復雜的公網環境中,消息經過哪些節點,中間有沒有被抓包,數據是否被惡意采集,這些問題普通用戶開和發者都容易忽略。如果數據通信過程中忽視了安全需求,很容易造成用戶數據的泄露,數據的安全保障對于產品而言也很重要;
第三:需要應對網絡故障或服務單點故障的難題。開發者代碼寫得再好也無法避免硬件故障或是網絡故障這種不可預知的問題,在產品積累了一定的用戶量之后,如果遇到服務可用性問題會造成用戶流失。
第四:架構需要具備足夠的彈性。在用戶量級上來之后能支持快速的水平擴展,不會因為架構的問題需要重構。
最后:消息投遞慢。聊天室對消息的即時性要求非常高,同一條消息在投遞給不同成員時需要在毫秒級的延時完成,如果消息投遞慢了會造成消息時間線錯亂,聊天室里的人無法理解上下文場景。
基于這些難點,我們提出聊天室需要具備這些指標:跨平臺、數據加密、高可用、易擴展、高并發低延遲。
云信聊天室的架構
上圖是網易云信的聊天室分層架構。
客戶端層:處理各種設備的兼容問題,包括對ios,Android,Windows, Web等各種開發平臺的語言適配;消息通道的管理維護,包括移動設備上的弱網絡管理,斷線重連等;保證數據安全,所有上行下行的數據包都需要加解密處理,規避數據泄露或中間人攻擊等各種安全風險。
網關接入層:管理大量客戶端連接,單個節點可以維護的客戶端數量在數十萬量級;處理不同類型客戶端的協議兼容,由于客戶端實現技術的多樣性,導致客戶端與網關之間底層的數據通信協議存在差異,需要由不同的接入網關做協議轉換;處理數據安全邏輯;跨網絡的高可用邏輯,網絡級別的主備(誰知道哪天網線會被藍翔的畢業生挖斷呢?);廣播消息的高效下行分發,將收到的廣播消息分發到所有連接在本節點上的客戶端。
路由層:作為業務層接入的中轉,同時承擔負載均衡和高可用的作用,單個業務節點處理能力達到瓶頸時更方便的擴容,路由層使業務層擴容對前置網關層完全透明;當一個網絡的業務集群出現網絡故障時,可以切換到備用網絡,保證服務可用性。
業務層:處理聊天室內的業務消息,一個集群內有眾多節點,節點角色相互對等,任何一個節點的故障會使整個集群的處理能力下降,但不會引起服務的中斷,因為其他節點可以繼續接管業務數據包的處理;業務集群同樣有多個網絡環境的熱備,以應對可能出現的區域性網絡故障;
題外話
技術發展到現在已經不流行重復造輪子了,因為輪子的結構越來越復雜,功能性和非功能性的指標要求越來越高;而我們的用戶卻不會再等我們了。當我們還在畫輪子的圖紙的時候,競爭對手可能已經把車子都造好,在路上跑了。雖然我們不是非得自己造輪子,但是了解如何完成一個完美的輪子的制作過程和質量標準卻是非常有必要的,這也是我前面和你介紹了這么多的原因。
就像近幾年大數據技術非常流行,如果你對這個領域有所了解,你就會發現幾乎所有公司都在使用現有的平臺,比如Hadoop;或者直接使用,或者在上面做二次改造,原因無非就是上面說的幾點。
現在你遇到的也是同樣的問題,聊天室這種功能在最近兩年又火了起來,主要還是視頻直播業務的大規模擴張;所以能借用目前已有的平臺或工具是最快捷的路徑,應用需要關注的是怎么以最快的速度抓住用戶。
· EDN ·
【推薦閱讀】
視頻云直播:場景、技術及優化
項望烽:移動 IM 開發之登錄優化
網易云信∣真正穩定的IM云服務
http://netease.im/ ? 長按識別,關注精彩
點擊閱讀原文,進入云信官網
總結
以上是生活随笔為你收集整理的周梁伟:聊天室架构 如何跳出传统思维来设计?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 战友!6.19决战光荣日,一个真实的魔兽
- 下一篇: 它是光荣的象征, 得到它一定没有Bug!