一套分布式IM即時(shí)通訊系統(tǒng)的技術(shù)選型和架構(gòu)設(shè)計(jì)

本文由冰河分享五续,作者博客 binghe.gitcode.host,原題“這套分布式IM即時(shí)通訊系統(tǒng)如何寫到簡(jiǎn)歷上龄恋?我給你整理好了疙驾!”,本文有修訂和改動(dòng)篙挽。

1荆萤、引言

分布式IM即時(shí)通訊系統(tǒng)本質(zhì)上就是對(duì)線上聊天和用戶的管理。

針對(duì)聊天本身來說铣卡,最核心的需求就是:發(fā)送文字链韭、圖片、文件煮落、語音敞峭、視頻、消息緩存蝉仇、消息存儲(chǔ)旋讹、消息未讀、已讀轿衔、撤回沉迹,離線消息、歷史消息害驹、單聊鞭呕、群聊,多端同步宛官,以及其他一些需求葫松。

對(duì)用戶管理來說,存在的需求包含:添加好友底洗、查看好友列表腋么、刪除好友、查看好友信息亥揖、創(chuàng)建群聊珊擂、加入群聊、查看群成員信息费变、退出群聊摧扇、修改群昵稱、拉人進(jìn)群胡控、踢人出群扳剿、解散群聊旁趟、填寫群公告昼激、修改群備注以及其他用戶相關(guān)的需求等庇绽。

為了更好的理解分布式IM即時(shí)通訊系統(tǒng)的設(shè)計(jì),我站在架構(gòu)師的角度橙困,在充分了解系統(tǒng)需求瞧掺、業(yè)務(wù)流程和技術(shù)流程后,從全局視角為系統(tǒng)設(shè)定方案目標(biāo)凡傅,對(duì)技術(shù)方案進(jìn)行選型辟狈,對(duì)系統(tǒng)進(jìn)行總體架構(gòu)設(shè)計(jì)和分層架構(gòu)設(shè)計(jì),并梳理清楚發(fā)送消息的交互鏈路夏跷、單聊和群聊的交互鏈路哼转。希望對(duì)你有幫助。

2槽华、方案目標(biāo)

在進(jìn)行技術(shù)選型與總體架構(gòu)設(shè)計(jì)之前壹蔓,需要明確一個(gè)事項(xiàng),就是系統(tǒng)無論采用哪種方案猫态,采用哪種架構(gòu)設(shè)計(jì)都需要明確這種方案的業(yè)務(wù)目標(biāo)佣蓉、技術(shù)目標(biāo)和架構(gòu)目標(biāo),并在研發(fā)過程中不斷評(píng)估系統(tǒng)的總體性能表現(xiàn)亲雪,發(fā)現(xiàn)系統(tǒng)瓶頸并不斷進(jìn)行優(yōu)化勇凭。

總體上,我們搭建和開發(fā)的分布式IM即時(shí)通訊系統(tǒng)义辕,需要滿足如下方案目標(biāo)虾标。

具體是:

1)業(yè)務(wù)目標(biāo):滿足需求設(shè)計(jì)篇章中的各類需求場(chǎng)景;

2)技術(shù)目標(biāo):支持無限擴(kuò)容终息,百萬用戶同時(shí)在線聊天夺巩;

3)架構(gòu)目標(biāo):高并發(fā)、高性能周崭、高可用柳譬、可監(jiān)控、可預(yù)警续镇、可伸縮美澳,支持無限擴(kuò)展。

3摸航、技術(shù)選型

在技術(shù)選型上制跟,除了采用SpringBoot等基礎(chǔ)框架外,也會(huì)采用容器化方案酱虎。

同時(shí)雨膨,考慮到為了盡量降低技術(shù)門檻,在整個(gè)分布式IM即時(shí)通訊系統(tǒng)的技術(shù)選型中读串,主要采用市面上比較流行的技術(shù)框架和方案聊记。

具體選型如下所示:

1)開發(fā)框架:SpringBoot脾还、SpringCloud础钠、SpringCloud Alibaba宾袜、Dubbo玖瘸;

2)緩存:Redis分布式緩存+Guava本地緩存;

3)數(shù)據(jù)庫:MySQL舆床、TiDB棋蚌、HBase;

4)流量網(wǎng)關(guān):OpenResty+Lua挨队;

5)業(yè)務(wù)網(wǎng)關(guān):SpringCloud Gateway + Sentinel谷暮;

6)持久層框架:MyBatis、Mybatis-Plus盛垦;

7)服務(wù)配置坷备、服務(wù)注冊(cè)與發(fā)現(xiàn):Nacos;

8)消息中間件:RocketMQ情臭;

9)網(wǎng)絡(luò)通信:Netty省撑;

10)文件存儲(chǔ):Minio;

11)日志可視化治理:ELK俯在;

12)容器化管理:Swarm竟秫、Portainer;

13)監(jiān)控:Prometheus跷乐、Grafana肥败;

14)前端:Vue;

15)單元測(cè)試:Junit愕提;

16)基準(zhǔn)測(cè)試:JMH馒稍;

17)壓力測(cè)試:JMeter。

4浅侨、初步架構(gòu)設(shè)計(jì)

對(duì)于IM即時(shí)通訊系統(tǒng)來說纽谒,涵蓋了即時(shí)通訊后端服務(wù)、大后端平臺(tái)如输、SDK接入服務(wù)鼓黔、OpenAI接入服務(wù)、大前端UI不见,我相信不少小伙伴多多少少能夠畫出IM即時(shí)通訊系統(tǒng)的架構(gòu)圖澳化,大致如下圖所示。

其實(shí)稳吮,這種這種架構(gòu)設(shè)計(jì)也比較常見缎谷,在這種架構(gòu)設(shè)計(jì)中,Kong/Openresty/Nginx只做負(fù)載均衡和反向代理灶似,研發(fā)人員更多的是關(guān)注業(yè)務(wù)層和基礎(chǔ)層的開發(fā)列林,流量比較小時(shí)眼虱,這種架構(gòu)設(shè)計(jì)一般不會(huì)有什么問題。但是一旦流量比較大席纽,用戶調(diào)用后端平臺(tái)的接口發(fā)送消息時(shí),即時(shí)通訊SDK同步調(diào)用即時(shí)通訊服務(wù)的接口就會(huì)出現(xiàn)性能問題撞蚕。

因?yàn)槊總€(gè)終端同時(shí)只能與一個(gè)IM即時(shí)通訊服務(wù)實(shí)例建立連接润梯,如果大量的用戶終端恰好都與一個(gè)IM即時(shí)通訊服務(wù)建立連接,那即時(shí)通訊SDK頻繁同步調(diào)用同一個(gè)IM即時(shí)通訊服務(wù)的接口就會(huì)出現(xiàn)性能瓶頸甥厦。此時(shí)纺铭,出現(xiàn)性能瓶頸時(shí),不僅僅會(huì)影響到IM即時(shí)通訊服務(wù)刀疙,也會(huì)對(duì)后端平臺(tái)接收請(qǐng)求的業(yè)務(wù)造成一定的影響舶赔。

5、架構(gòu)設(shè)計(jì)優(yōu)化

既然上節(jié)圖中所示的架構(gòu)設(shè)計(jì)存在性能瓶頸谦秧,那我們?nèi)绾芜M(jìn)行優(yōu)化呢竟纳?

為此我們?cè)谇皥D基礎(chǔ)上進(jìn)行了優(yōu)化,優(yōu)化后的架構(gòu)如下圖所示疚鲤。

對(duì)比兩圖可以看出锥累,在屏蔽掉技術(shù)實(shí)現(xiàn)細(xì)節(jié)的前提下,我們將對(duì)業(yè)務(wù)的校驗(yàn)和流量管控進(jìn)行前置化集歇,放大Kong/OpenResty/Nginx的職責(zé)桶略,使得這些軟件不僅具備反向代理和負(fù)載均衡的功能,還能實(shí)現(xiàn)限流诲宇、黑白名單际歼、流量管控、業(yè)務(wù)校驗(yàn)等功能姑蓝。

也就是說鹅心,在這種架構(gòu)模式下,我們充分發(fā)揮了整個(gè)分布式IM即時(shí)通訊系統(tǒng)的入口職責(zé)纺荧,充分利用Kong/OpenResty/Nginx的高并發(fā)巴帮、高吞吐量的能力,盡量將大部分無效請(qǐng)求擋在整個(gè)系統(tǒng)之外虐秋。例如榕茧,用戶在沒登錄系統(tǒng)的前提下,就嘗試調(diào)用發(fā)送消息客给、添加好友用押、添加群組等等接口。這樣會(huì)大大減輕后臺(tái)平臺(tái)的業(yè)務(wù)壓力靶剑。

除了在Kong/OpenResty/Nginx中實(shí)現(xiàn)限流蜻拨、黑白名單池充、流量管控、業(yè)務(wù)校驗(yàn)等功能外缎讼,我們還引入了業(yè)務(wù)網(wǎng)關(guān)集群收夸,實(shí)現(xiàn)限流、降級(jí)血崭、熔斷卧惜、流控、校驗(yàn)夹纫、鑒權(quán)等功能咽瓷,進(jìn)一步保證下游系統(tǒng)的穩(wěn)定性和安全。

為了解決大量用戶終端恰好連接到同一個(gè)IM即時(shí)通訊服務(wù)實(shí)例舰讹,IM即時(shí)通訊SDK頻繁調(diào)用同一個(gè)IM即時(shí)通訊服務(wù)實(shí)例的接口造成的性能問題茅姜。我們?cè)贗M即時(shí)通訊服務(wù)SDK與IM即時(shí)通訊服務(wù)之間引入了RocketMQ集群

IM即時(shí)通訊服務(wù)集群中的每一個(gè)IM即時(shí)通訊服務(wù)實(shí)例在集群中都有一個(gè)唯一的ID月匣,并且每個(gè)IM即時(shí)通訊服務(wù)實(shí)例在啟動(dòng)后钻洒,只會(huì)監(jiān)聽RocketMQ中與自身ID相關(guān)的Topic。這樣每個(gè)IM即時(shí)通訊服務(wù)只會(huì)收到與自身ID相關(guān)的Topic中的消息锄开,不會(huì)接收所有的消息航唆。

當(dāng)用戶登錄系統(tǒng)后,就會(huì)與IM即時(shí)通訊服務(wù)建立長連接院刁,并且會(huì)以用戶ID和終端為Key糯钙,以IM即時(shí)通訊服務(wù)的ID為value,將其存儲(chǔ)到分布式緩存中退腥。同時(shí)任岸,會(huì)以用戶ID和終端為Key,以用戶終端與IM即時(shí)通訊服務(wù)建立的長連接為value狡刘,將其存儲(chǔ)到IM即時(shí)通訊服務(wù)本地內(nèi)存中享潜。

當(dāng)用戶調(diào)用后端平臺(tái)的接口發(fā)消息時(shí),會(huì)帶上目標(biāo)用戶的ID嗅蔬,并且在IM即時(shí)通訊SDK中會(huì)指定用戶登錄的終端設(shè)備剑按,最終會(huì)通過IM即時(shí)通訊SDK向RocketMQ發(fā)送消息。

此時(shí)IM即時(shí)通訊SDK會(huì)根據(jù)目標(biāo)用戶ID和終端從分布式緩存中獲取目標(biāo)用戶連接的IM即時(shí)通訊服務(wù)的ID澜术,并向此ID相關(guān)的Topic發(fā)送消息艺蝴。此時(shí)與目標(biāo)用戶建立長連接的IM即時(shí)通訊服務(wù)就會(huì)接收到RocketMQ中的消息,隨后根據(jù)用戶ID和終端從本地緩存中獲取到與用戶終端建立的長連接鸟废,并基于此長連接向用戶推送消息猜敢。

另外,在實(shí)際實(shí)現(xiàn)中,為了避免大量用戶同時(shí)只連接IM即時(shí)通訊服務(wù)集群中的某一個(gè)服務(wù)實(shí)例缩擂,會(huì)對(duì)用戶連接的IP鼠冕、瀏覽器指紋、手機(jī)設(shè)備等做Hash和取模運(yùn)算胯盯,使其盡量均勻分布到集群中的每一個(gè)服務(wù)實(shí)例上懈费。

那么問題來了,這種架構(gòu)設(shè)計(jì)還有進(jìn)一步優(yōu)化的空間嗎博脑?

6憎乙、容器化架構(gòu)設(shè)計(jì)

為進(jìn)一步增強(qiáng)分布式IM即時(shí)通訊系統(tǒng)的性能、可用性和彈性伸縮能力趋厉,我們可以對(duì)分布式IM即時(shí)通訊系統(tǒng)進(jìn)行容器化架構(gòu)設(shè)計(jì),如下圖所示胶坠。

可以看到君账,我們對(duì)分布式IM即時(shí)通訊系統(tǒng)的架構(gòu)設(shè)計(jì)進(jìn)行了進(jìn)一步優(yōu)化,采用了容器化架構(gòu)設(shè)計(jì)沈善。在原有架構(gòu)的基礎(chǔ)上乡数,我們進(jìn)行了如下改進(jìn)和優(yōu)化。

1)基礎(chǔ)支撐服務(wù):基礎(chǔ)支撐服務(wù)會(huì)由各種基礎(chǔ)中間件闻牡、數(shù)據(jù)存儲(chǔ)服務(wù)净赴、以及監(jiān)控服務(wù)實(shí)現(xiàn),包含:MySQL數(shù)據(jù)庫罩润、TiDB數(shù)據(jù)庫玖翅、HBase、Redis緩存割以、RocketMQ消息隊(duì)列金度、Prometheus監(jiān)控和Portainer容器管理等基礎(chǔ)中間件實(shí)現(xiàn),基礎(chǔ)支撐服務(wù)會(huì)對(duì)整個(gè)分布式IM即時(shí)通訊系統(tǒng)提供最基礎(chǔ)的數(shù)據(jù)严沥、傳輸猜极、監(jiān)控和容器管理等服務(wù)。

2)容器化:在容器化層面消玄,會(huì)通過Docker跟伏、Swarm和Portainer實(shí)現(xiàn),其中翩瓜,會(huì)基于Swarm和Portainer對(duì)容器化進(jìn)行管理受扳。

3)其他基礎(chǔ)性功能實(shí)現(xiàn):除了上述分層架構(gòu)外,對(duì)于建設(shè)分布式IM即時(shí)通訊系統(tǒng)來說兔跌,還要考慮異常監(jiān)控辞色、服務(wù)注冊(cè)與發(fā)現(xiàn)、可視化、服務(wù)降級(jí)與兜底數(shù)據(jù)相满、服務(wù)限流层亿、服務(wù)容災(zāi)、容量規(guī)劃與擴(kuò)縮容和全鏈路壓測(cè)等立美。

7匿又、DDD分層業(yè)務(wù)架構(gòu)設(shè)計(jì)

在分布式IM即時(shí)通訊系統(tǒng)中,不管是大后端平臺(tái)建蹄,還是IM即時(shí)通訊服務(wù)碌更,我們都會(huì)對(duì)業(yè)務(wù)層的代碼采用分層業(yè)務(wù)架構(gòu)。

這里洞慎,可以借鑒DDD的分層架構(gòu)思想痛单,將代碼總體上分成展示層、應(yīng)用層劲腿、領(lǐng)域?qū)雍突A(chǔ)設(shè)施層四個(gè)層次旭绒。

但是,考慮到分布式IM即時(shí)通訊系統(tǒng)的特殊性焦人,又不會(huì)嚴(yán)格按照DDD的原則來設(shè)計(jì)代碼分層挥吵,具體按照如下圖所示。

可以看到花椭,分布式IM即時(shí)通訊系統(tǒng)會(huì)借鑒DDD的設(shè)計(jì)思想忽匈,但是不會(huì)完全按照DDD的方式進(jìn)行設(shè)計(jì)。

1)展示層:展示層矿辽,也叫做用戶UI層丹允,是DDD設(shè)計(jì)的最上層,對(duì)外提供API接口袋倔,接收客戶端請(qǐng)求嫌松,解析參數(shù),返回結(jié)果數(shù)據(jù)奕污,并對(duì)異常進(jìn)行處理萎羔。

2)應(yīng)用層:應(yīng)用層,也叫做Application層碳默,應(yīng)用層主要處理容易變化的業(yè)務(wù)場(chǎng)景贾陷,可對(duì)相關(guān)的事件、調(diào)度和其他聚合操作進(jìn)行相關(guān)的處理嘱根。

3)領(lǐng)域?qū)樱?/i>領(lǐng)域?qū)铀璺希步凶鯠omain層,領(lǐng)域?qū)涌梢哉f是DDD設(shè)計(jì)的精髓所在该抒,它是將業(yè)務(wù)系統(tǒng)中相對(duì)不變的部分抽象出來封裝成領(lǐng)域模型慌洪。在分布式IM即時(shí)通訊系統(tǒng)的設(shè)計(jì)中,領(lǐng)域?qū)踊静粫?huì)依賴其他層,也不會(huì)依賴基礎(chǔ)設(shè)施層冈爹,這里是與DDD設(shè)計(jì)存在區(qū)別的地方涌攻。

4)基礎(chǔ)設(shè)施層:基礎(chǔ)設(shè)施層,也叫做Infrastructure層频伤,基礎(chǔ)設(shè)施層會(huì)對(duì)其他各層提供通用的基礎(chǔ)能力恳谎,在分布式IM即時(shí)通訊系統(tǒng)中,就包括了緩存憋肖、通用工具類因痛、消息、系統(tǒng)的持久化機(jī)制等岸更。

8鸵膏、總體IM消息交互鏈路

在分布式IM即時(shí)通訊系統(tǒng)中,我們忽略掉其他一些細(xì)節(jié)信息怎炊,重點(diǎn)關(guān)注下發(fā)送消息的交互鏈路邏輯谭企。不管是單聊還是群聊,最終都需要通過IM即時(shí)通訊服務(wù)將消息推送給用戶的終端结胀。此時(shí)發(fā)送消息的流程如下圖所示赞咙。

可以看到:用戶在分布式IM即時(shí)通訊系統(tǒng)發(fā)送消息時(shí)责循,不管是單聊還是群聊糟港,最終的消息都會(huì)推送到用戶登錄的終端設(shè)備上。假設(shè)此時(shí)用戶A給用戶B發(fā)送消息院仿,或者用戶A和用戶B在同一個(gè)群組秸抚,用戶A向群組發(fā)送消息,用戶B接收消息的主要流程如下歹垫。

具體是:

1)用戶A調(diào)用后端平臺(tái)的接口向用戶B發(fā)送消息剥汤,并且發(fā)送的消息中會(huì)帶有用戶B的ID以及終端信息;

2)后端平臺(tái)將消息緩存起來排惨,并且會(huì)將消息異步寫入消息庫吭敢;

3)后端平臺(tái)從Redis中獲取用戶B連接的IM即時(shí)通訊服務(wù)的ID;

4)后端平臺(tái)獲取到用戶B連接的IM即時(shí)通訊服務(wù)的ID后暮芭,會(huì)向RocketMQ中用戶B連接的IM即時(shí)通訊服務(wù)ID對(duì)應(yīng)的Topic發(fā)送消息鹿驼;

5)IM即時(shí)通訊服務(wù)會(huì)監(jiān)聽自身服務(wù)ID對(duì)應(yīng)的RocketMQ中Topic的消息,此時(shí)辕宏,用戶B連接的IM即時(shí)通訊服務(wù)會(huì)接收到消息畜晰;

6)IM即時(shí)通訊服務(wù)接收到消息后,會(huì)根據(jù)用戶B的ID以及終端信息從緩存中獲取用戶B與IM即時(shí)通訊服務(wù)建立的連接瑞筐,并且通過這個(gè)連接向用戶B推送消息凄鼻。

要實(shí)現(xiàn)如上發(fā)送消息的流程,前提是要滿足如下條件:

1)后端平臺(tái)滿足分布式條件,可隨時(shí)橫向擴(kuò)展块蚌;

2)IM即時(shí)通訊服務(wù)滿足分布式條件闰非,可隨時(shí)橫向擴(kuò)展;

3)每個(gè)啟動(dòng)的IM即時(shí)通訊服務(wù)實(shí)例在集群中都有一個(gè)唯一的ID匈子;

4)每個(gè)IM即時(shí)通訊服務(wù)河胎,都只監(jiān)聽自身ID對(duì)應(yīng)的RocketMQ中Topic的消息;

5)用戶登錄分布式IM即時(shí)通訊系統(tǒng)后虎敦,會(huì)與IM即時(shí)通訊服務(wù)建立長連接游岳,并且會(huì)根據(jù)用戶ID和所在的終端緩存長連接,同時(shí)會(huì)根據(jù)用戶ID和所在的終端將連接的IM即時(shí)通訊服務(wù)的ID緩存到Redis其徙;

6)用戶發(fā)送消息時(shí)胚迫,會(huì)根據(jù)目標(biāo)用戶的ID和終端從Redis中獲取IM即時(shí)通訊服務(wù)的ID,進(jìn)而向當(dāng)前IM即時(shí)通訊服務(wù)的ID對(duì)應(yīng)的RocketMQ的Topic發(fā)送消息唾那;

7)對(duì)應(yīng)的IM即時(shí)通訊服務(wù)監(jiān)聽并接收到RocketMQ消息后访锻,會(huì)根據(jù)目標(biāo)用戶的ID和終端從緩存中獲取到用戶的連接信息,向目標(biāo)用戶推送消息闹获。

9期犬、IM單聊交互鏈路

單聊就是在分布式IM即時(shí)通訊系統(tǒng)中,一個(gè)用戶直接與另外一個(gè)用戶聊天避诽,也就是一對(duì)一的聊天龟虎。在這種場(chǎng)景下,很有可能單聊的兩個(gè)用戶中沙庐,出現(xiàn)用戶不在線的情況鲤妥。

例如:用戶A給用戶B發(fā)送消息時(shí),用戶B可能不在線拱雏。

此時(shí)棉安,我們就需要將用戶A向用戶B發(fā)送的消息存儲(chǔ)起來。

其實(shí)铸抑,在我們實(shí)現(xiàn)的分布式IM即時(shí)通訊系統(tǒng)中贡耽,無論把用戶B是否在線,都會(huì)存儲(chǔ)消息記錄鹊汛。當(dāng)用戶B登錄系統(tǒng)后蒲赂,將消息同步給用戶B,如下圖所示柒昏。

可以看到凳宙,用戶A向用戶B發(fā)送消息時(shí):

1)如果用戶B在線,就可以按照發(fā)送消息的交互鏈路向用戶B發(fā)送消息了职祷;

2)如果用戶B不在線氏涩,此時(shí)就無法向用戶B正常推送消息届囚。當(dāng)用戶B登錄分布式IM即時(shí)通訊系統(tǒng)后,就會(huì)調(diào)用后端平臺(tái)的接口拉取所有未讀消息是尖,并通過用戶B在線流程向用戶B推送消息意系。

10、IM群聊交互鏈路

群聊就是在分布式IM即時(shí)通訊系統(tǒng)中饺汹,多個(gè)用戶在同一個(gè)群組中進(jìn)行聊天蛔添。

此時(shí)在發(fā)送消息時(shí),我們可以通過群組ID找出群內(nèi)所有在線的用戶兜辞,將消息即時(shí)發(fā)送給在線的用戶迎瞧。

那些未在線的用戶就按照單聊未在線的用戶進(jìn)行處理,如下圖所示逸吵。

可以看到凶硅,群聊的交互鏈路流程如下所示:

1)用戶調(diào)用后端平臺(tái)的接口向群組發(fā)送消息;

2)后端平臺(tái)將消息緩存并異步寫入消息庫扫皱;

3)由于是向群組發(fā)送消息足绅,群里有多個(gè)用戶,此時(shí)就會(huì)從Redis中獲取所有用戶連接的IM即時(shí)通訊服務(wù)ID列表韩脑;

4)對(duì)用戶按照服務(wù)ID分組氢妈,將相同服務(wù)ID下的用戶分在同一個(gè)邏輯分組里,方便后續(xù)推送消息段多,并且會(huì)記錄未在線的用戶列表首量;

5)循環(huán)向每個(gè)服務(wù)ID對(duì)應(yīng)的RocketMQ中的Topic發(fā)送消息;

6)廣播處理未在線用戶的未讀消息ID衩匣;

7)IM即時(shí)通訊服務(wù)會(huì)監(jiān)聽自身服務(wù)ID對(duì)應(yīng)的Topic蕾总,會(huì)隨時(shí)接收推送到自身服務(wù)的消息粥航;

8)當(dāng)IM即時(shí)通訊服務(wù)接收到消息后琅捏,此時(shí)用戶掉線,或者用戶不在線递雀,向用戶推送消息就會(huì)失敗柄延,或者未查詢到用戶與IM即時(shí)通訊服務(wù)建立的連接,就不會(huì)向用戶推送消息缀程;

9)當(dāng)用戶登錄分布式IM即時(shí)通訊系統(tǒng)后搜吧,會(huì)從后端平臺(tái)拉取歷史(離線)消息,并通過用戶在線的流程杨凑,向用戶推送消息滤奈;

好了,看到這里撩满,你明白如何設(shè)計(jì)一個(gè)高度可擴(kuò)展的分布式IM即時(shí)通訊系統(tǒng)了嗎蜒程?

11绅你、相關(guān)資料

[1]?淺談IM系統(tǒng)的架構(gòu)設(shè)計(jì)

[2]?簡(jiǎn)述移動(dòng)端IM開發(fā)的那些坑:架構(gòu)設(shè)計(jì)、通信協(xié)議和客戶端

[3]?一套海量在線用戶的移動(dòng)端IM架構(gòu)設(shè)計(jì)實(shí)踐分享(含詳細(xì)圖文)

[4]?一套原創(chuàng)分布式即時(shí)通訊(IM)系統(tǒng)理論架構(gòu)方案

[5]?移動(dòng)端IM中大規(guī)模群消息的推送如何保證效率昭躺、實(shí)時(shí)性忌锯?

[6]?一套億級(jí)用戶的IM架構(gòu)技術(shù)干貨(上篇):整體架構(gòu)、服務(wù)拆分等

[7]?一套億級(jí)用戶的IM架構(gòu)技術(shù)干貨(下篇):可靠性领炫、有序性偶垮、弱網(wǎng)優(yōu)化等

[8]?從新手到專家:如何設(shè)計(jì)一套億級(jí)消息量的分布式IM系統(tǒng)

[9]?企業(yè)微信的IM架構(gòu)設(shè)計(jì)揭秘:消息模型、萬人群帝洪、已讀回執(zhí)似舵、消息撤回等

[10]?融云技術(shù)分享:全面揭秘億級(jí)IM消息的可靠投遞機(jī)制

[11]?阿里IM技術(shù)分享(三):閑魚億級(jí)IM消息系統(tǒng)的架構(gòu)演進(jìn)之路

[12]?基于實(shí)踐:一套百萬消息量小規(guī)模IM系統(tǒng)技術(shù)要點(diǎn)總結(jié)

[13]?跟著源碼學(xué)IM(十):基于Netty,搭建高性能IM集群(含技術(shù)思路+源碼)

[14]?一套十萬級(jí)TPS的IM綜合消息系統(tǒng)的架構(gòu)實(shí)踐與思考

[15]?得物從0到1自研客服IM系統(tǒng)的技術(shù)實(shí)踐之路

[16]?海量用戶IM聊天室的架構(gòu)設(shè)計(jì)與實(shí)踐

[17]?史上最通俗Netty入門長文:基本介紹葱峡、環(huán)境搭建啄枕、動(dòng)手實(shí)戰(zhàn)

[18]?新手入門:目前為止最透徹的的Netty高性能原理和框架架構(gòu)解析

[19]?寫給初學(xué)者:Java高性能NIO框架Netty的學(xué)習(xí)方法和進(jìn)階策略

[20]?手把手教你用Netty實(shí)現(xiàn)網(wǎng)絡(luò)通信程序的心跳機(jī)制、斷線重連機(jī)制

[21]?史上最強(qiáng)Java NIO入門:擔(dān)心從入門到放棄的族沃,請(qǐng)讀這篇频祝!

(本文已同步發(fā)布于:http://www.52im.net/thread-4564-1-1.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脆淹,隨后出現(xiàn)的幾起案子常空,更是在濱河造成了極大的恐慌,老刑警劉巖盖溺,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漓糙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烘嘱,警方通過查閱死者的電腦和手機(jī)昆禽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝇庭,“玉大人醉鳖,你說我怎么就攤上這事∠冢” “怎么了盗棵?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長北发。 經(jīng)常有香客問我纹因,道長,這世上最難降的妖魔是什么琳拨? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任瞭恰,我火速辦了婚禮,結(jié)果婚禮上狱庇,老公的妹妹穿的比我還像新娘惊畏。我一直安慰自己是牢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布陕截。 她就那樣靜靜地躺著驳棱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪农曲。 梳的紋絲不亂的頭發(fā)上社搅,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音乳规,去河邊找鬼形葬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛暮的,可吹牛的內(nèi)容都是我干的笙以。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼冻辩,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼猖腕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恨闪,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤倘感,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后咙咽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體老玛,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年钧敞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜡豹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溉苛,死狀恐怖镜廉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炊昆,我是刑警寧澤桨吊,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布威根,位于F島的核電站凤巨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洛搀。R本人自食惡果不足惜敢茁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望留美。 院中可真熱鬧彰檬,春花似錦伸刃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至较雕,卻和暖如春碉哑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亮蒋。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工扣典, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慎玖。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓贮尖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趁怔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子湿硝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容