IM即时通讯:如何跳出传统思维来设计聊天室架构?
因?yàn)橐曨l直播業(yè)務(wù)的大規(guī)模擴(kuò)張,聊天室這種功能在最近幾年又火了起來(lái)。本篇文章將會(huì)重點(diǎn)挑選聊天室這個(gè)典型場(chǎng)景,和大家分享一下網(wǎng)易云信在實(shí)現(xiàn)這個(gè)功能時(shí)是如何做架構(gòu)設(shè)計(jì)的。
?
相關(guān)推薦閱讀
幾十萬(wàn)人同時(shí)在線的直播間聊天,如何設(shè)計(jì)服務(wù)端架構(gòu)?
高并發(fā)IM系統(tǒng)架構(gòu)優(yōu)化實(shí)踐
?
常見(jiàn)的虛擬社群
聊天室的應(yīng)用場(chǎng)景非常廣,除了傳統(tǒng)的圖文聊天外,時(shí)下流行的視頻彈幕、在線秀場(chǎng)、在線教育、游戲互動(dòng)等各式各樣產(chǎn)品中都有類似的應(yīng)用場(chǎng)景。
在討論聊天室之前,我們先了解下幾種常見(jiàn)的虛擬社群形態(tài)。下表從參與人數(shù)、消息送達(dá)即時(shí)性、離線消息關(guān)注度等維度對(duì)論壇、IM P2P、IM群和聊天室這幾種常見(jiàn)的虛擬社群形態(tài)做了簡(jiǎn)單對(duì)比,從這個(gè)對(duì)比可以看到聊天室是不同于論壇和群模式的一種虛擬組織,聊天室的架構(gòu)需要跳出傳統(tǒng)思維來(lái)設(shè)計(jì)。
聊天室跟普通的IM群(微信群,QQ群等)相比最大的不同點(diǎn)在于它是一個(gè)比較開(kāi)放的虛擬組織。我們可以將聊天室比喻成一個(gè)廣場(chǎng),廣場(chǎng)是開(kāi)放無(wú)邊界的,所有的人都可以隨進(jìn)隨出,而群就像一個(gè)房間,是一個(gè)有邊界有容量上限的私密組織,并且進(jìn)入這個(gè)房間需要一定條件,一般是主動(dòng)申請(qǐng)加入或被邀請(qǐng)加入。聊天室對(duì)比BBS論壇這種虛擬組織來(lái)說(shuō),它既具有了IM群消息即時(shí)送達(dá)的特性又有論壇參與人數(shù)無(wú)上限的特性。
?
聊天室關(guān)鍵技術(shù)和難點(diǎn)
那么,是否能從一個(gè)已有的成熟技術(shù)框架上改造一個(gè)聊天室出來(lái)呢?
經(jīng)過(guò)前面的比較我們看到,聊天室和論壇及IM群都具有一定的共性,看起來(lái)似乎可以將論壇架構(gòu)改造成聊天室,也可以將IM群改造成聊天室。
路徑一:將論壇架構(gòu)改造成聊天室,首先需要提高消息送達(dá)的即時(shí)性,由于論壇都是基于HTTP協(xié)議的,為了保證消息即時(shí)送達(dá),需要客戶端不斷輪詢服務(wù)器來(lái)獲取新的消息,如果對(duì)即時(shí)性的要求越高,那輪詢的時(shí)間就需要縮短,這種模式在用戶量達(dá)到一定規(guī)模后是無(wú)法承載的。為了保證消息的高效送達(dá),客戶端與服務(wù)器之間的需要采用長(zhǎng)連接機(jī)制,新消息的送達(dá)通過(guò)服務(wù)器主動(dòng)向客戶端下推來(lái)完成。
路徑二:將已有的IM群改造成聊天室,由于群具有對(duì)離線消息關(guān)注度高的特性,所有的群消息在成員離線時(shí)需要持久化,因而群人數(shù)越多效率越低,也正是因?yàn)檫@個(gè)原因,一般的IM群都是有人數(shù)上限的,如果想把群改造成聊天室,就不能存離線消息,所以這種方式看起來(lái)也不是這么順暢。
現(xiàn)在市場(chǎng)上很多提供聊天室類服務(wù)的產(chǎn)品其實(shí)都是基于群的模式來(lái)實(shí)現(xiàn)的,所以人數(shù)上限一直是一個(gè)難以突破的瓶頸,甚至有的服務(wù)直接使用“超大群”或“千人群”這樣一種特殊群模式來(lái)滿足用戶對(duì)聊天室場(chǎng)景的需求。
下面我們來(lái)看下,如果要實(shí)現(xiàn)一個(gè)人數(shù)無(wú)上限的聊天室服務(wù),需要解決哪些難題。
首先:客戶端多樣性。近幾年來(lái)移動(dòng)互聯(lián)網(wǎng)發(fā)展得非常快,現(xiàn)在推出的APP一般都需要同時(shí)具備iOS版、安卓版和Web版、PC版等不同的版本,跨平臺(tái)的開(kāi)發(fā)需求一直是攔在創(chuàng)業(yè)團(tuán)隊(duì)面前的一座大山;
第二:數(shù)據(jù)安全保障。當(dāng)前的網(wǎng)絡(luò)環(huán)境異常復(fù)雜,我們的APP在客戶端與服務(wù)器之間的數(shù)據(jù)通信都暴露在復(fù)雜的公網(wǎng)環(huán)境中,消息經(jīng)過(guò)哪些節(jié)點(diǎn),中間有沒(méi)有被抓包,數(shù)據(jù)是否被惡意采集,這些問(wèn)題普通用戶開(kāi)和發(fā)者都容易忽略。如果數(shù)據(jù)通信過(guò)程中忽視了安全需求,很容易造成用戶數(shù)據(jù)的泄露,數(shù)據(jù)的安全保障對(duì)于產(chǎn)品而言也很重要;
第三:需要應(yīng)對(duì)網(wǎng)絡(luò)故障或服務(wù)單點(diǎn)故障的難題。開(kāi)發(fā)者代碼寫(xiě)得再好也無(wú)法避免硬件故障或是網(wǎng)絡(luò)故障這種不可預(yù)知的問(wèn)題,在產(chǎn)品積累了一定的用戶量之后,如果遇到服務(wù)可用性問(wèn)題會(huì)造成用戶流失;
第四:架構(gòu)需要具備足夠的彈性。在用戶量級(jí)上來(lái)之后能支持快速的水平擴(kuò)展,不會(huì)因?yàn)榧軜?gòu)的問(wèn)題需要重構(gòu);
最后:消息投遞慢。聊天室對(duì)消息的即時(shí)性要求非常高,同一條消息在投遞給不同成員時(shí)需要在毫秒級(jí)的延時(shí)完成,如果消息投遞慢了會(huì)造成消息時(shí)間線錯(cuò)亂,聊天室里的人無(wú)法理解上下文場(chǎng)景。
基于這些難點(diǎn),我們提出聊天室需要具備這些指標(biāo):跨平臺(tái)、數(shù)據(jù)加密、高可用、易擴(kuò)展、高并發(fā)低延遲。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 網(wǎng)易云信聊天室的架構(gòu)
上圖是網(wǎng)易云信的聊天室分層架構(gòu)。
客戶端層:處理各種設(shè)備的兼容問(wèn)題,包括對(duì)ios,Android,Windows, Web等各種開(kāi)發(fā)平臺(tái)的語(yǔ)言適配;消息通道的管理維護(hù),包括移動(dòng)設(shè)備上的弱網(wǎng)絡(luò)管理,斷線重連等;保證數(shù)據(jù)安全,所有上行下行的數(shù)據(jù)包都需要加解密處理,規(guī)避數(shù)據(jù)泄露或中間人攻擊等各種安全風(fēng)險(xiǎn)。
網(wǎng)關(guān)接入層:管理大量客戶端連接,單個(gè)節(jié)點(diǎn)可以維護(hù)的客戶端數(shù)量在數(shù)十萬(wàn)量級(jí);處理不同類型客戶端的協(xié)議兼容,由于客戶端實(shí)現(xiàn)技術(shù)的多樣性,導(dǎo)致客戶端與網(wǎng)關(guān)之間底層的數(shù)據(jù)通信協(xié)議存在差異,需要由不同的接入網(wǎng)關(guān)做協(xié)議轉(zhuǎn)換;處理數(shù)據(jù)安全邏輯;跨網(wǎng)絡(luò)的高可用邏輯,網(wǎng)絡(luò)級(jí)別的主備(誰(shuí)知道哪天網(wǎng)線會(huì)被藍(lán)翔的畢業(yè)生挖斷呢?);廣播消息的高效下行分發(fā),將收到的廣播消息分發(fā)到所有連接在本節(jié)點(diǎn)上的客戶端。
路由層:作為業(yè)務(wù)層接入的中轉(zhuǎn),同時(shí)承擔(dān)負(fù)載均衡和高可用的作用,單個(gè)業(yè)務(wù)節(jié)點(diǎn)處理能力達(dá)到瓶頸時(shí)更方便的擴(kuò)容,路由層使業(yè)務(wù)層擴(kuò)容對(duì)前置網(wǎng)關(guān)層完全透明;當(dāng)一個(gè)網(wǎng)絡(luò)的業(yè)務(wù)集群出現(xiàn)網(wǎng)絡(luò)故障時(shí),可以切換到備用網(wǎng)絡(luò),保證服務(wù)可用性。
業(yè)務(wù)層:處理聊天室內(nèi)的業(yè)務(wù)消息,一個(gè)集群內(nèi)有眾多節(jié)點(diǎn),節(jié)點(diǎn)角色相互對(duì)等,任何一個(gè)節(jié)點(diǎn)的故障會(huì)使整個(gè)集群的處理能力下降,但不會(huì)引起服務(wù)的中斷,因?yàn)槠渌?jié)點(diǎn)可以繼續(xù)接管業(yè)務(wù)數(shù)據(jù)包的處理;業(yè)務(wù)集群同樣有多個(gè)網(wǎng)絡(luò)環(huán)境的熱備,以應(yīng)對(duì)可能出現(xiàn)的區(qū)域性網(wǎng)絡(luò)故障。
?
看完文章還是不知道怎么做?那么可以嘗試借用目前已有的平臺(tái)或工具,現(xiàn)在應(yīng)用需要關(guān)注的是怎么以最快的速度抓住用戶。網(wǎng)易云信是一個(gè)面對(duì)開(kāi)發(fā)者的很好的IM云平臺(tái)。十余年的研發(fā)積累,使其在即時(shí)通訊技術(shù)方面處于全國(guó)領(lǐng)先水平。網(wǎng)易云信至今已申請(qǐng)了60余項(xiàng)IM專利,遠(yuǎn)超市場(chǎng)同類產(chǎn)品。歡迎大家與我們討論IM技術(shù),也歡迎大家多多關(guān)注網(wǎng)易云信。
另外,想要獲取更多產(chǎn)品干貨、技術(shù)干貨,記得關(guān)注網(wǎng)易云信博客哦~
總結(jié)
以上是生活随笔為你收集整理的IM即时通讯:如何跳出传统思维来设计聊天室架构?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 抱抱星英语Antony:不要用互联网思维
- 下一篇: 如何使用 Javascript/node