隨著移動(dòng)互聯(lián)網(wǎng)、AI的飛速發(fā)展,高性能高并發(fā)IM(即時(shí)通訊),有著非常廣泛的應(yīng)用場(chǎng)景。
一切高實(shí)時(shí)性通訊、消息推送的場(chǎng)景,都需要高并發(fā) IM 。
私信、聊天、大規(guī)模推送、視頻會(huì)議、彈幕、抽獎(jiǎng)、互動(dòng)游戲、基于位置的應(yīng)用(Uber、滴滴司機(jī)位置)、在線教育、智能家居等。
有這么多的應(yīng)用場(chǎng)景,對(duì)于想成長(zhǎng)為JAVA高手的小伙伴們,高并發(fā)IM 都繞不開(kāi)一個(gè)話題。尤其是對(duì)于APP開(kāi)發(fā)的小伙伴們來(lái)說(shuō),即時(shí)通訊,已經(jīng)成為大多數(shù)APP標(biāo)配。移動(dòng)互聯(lián)網(wǎng)時(shí)代,推送(Push)服務(wù)成為App應(yīng)用不可或缺的重要組成部分,推送服務(wù)可以提升用戶的活躍度和留存率。我們的手機(jī)每天接收到各種各樣的廣告和提示消息等大多數(shù)都是通過(guò)推送服務(wù)實(shí)現(xiàn)的。
隨著5G時(shí)代物聯(lián)網(wǎng)的發(fā)展,未來(lái)所有接入物聯(lián)網(wǎng)的智能設(shè)備,都將是IM系統(tǒng)的客戶端,這就意味著推送服務(wù)未來(lái)會(huì)面臨海量的設(shè)備和終端接入。為了支持這些千萬(wàn)級(jí)、億級(jí)終端,一定是需要強(qiáng)悍的后臺(tái)系統(tǒng)。對(duì)于想在后臺(tái)有所成就的小伙伴們來(lái)說(shuō),高并發(fā)IM實(shí)戰(zhàn),更是在終極BOSS PK之前的一場(chǎng)不可或缺的打怪練手。
路一步一步走,飯一口一口吃。飛起來(lái)之前的第一步,先來(lái)完成一個(gè)并發(fā)量在十萬(wàn)級(jí)別的 IM單體系統(tǒng)架構(gòu)。
傳統(tǒng)的BIO模型是肯定不行的,那么就只能使用 NIO 了。和阻塞模式的OIO(old IO)相比,JAVA NIO 的原理,也是比較復(fù)雜的。瘋狂創(chuàng)客圈的這三篇 JAVA NIO 簡(jiǎn)介 | Java NIO Buffer | Java NIO Channel 文件,對(duì)JAVA NIO 做了比較詳細(xì)的介紹。
JAVA NIO本身比較復(fù)雜,如果要通過(guò)JAVA NIO 寫(xiě)一個(gè)大型的程序,更加的復(fù)雜了。于是,一個(gè)非常牛逼的框架就擺在眼前,它就是Netty。 做JAVA NIO 的編程,Netty 一定不能少。Netty 的牛逼之處,就是通過(guò) Reactor 模式、pipeline 模式 、future promise模式 這些神一級(jí)的 JAVA設(shè)計(jì)模式,對(duì) JAVA NIO 進(jìn)行了封裝。在使用Netty之前,一定要先了解這幾大模式,一定能事半功倍。
大部分小伙伴應(yīng)該都聽(tīng)說(shuō)過(guò) openfire 吧。 這個(gè)傳統(tǒng)的企業(yè)級(jí)開(kāi)源IM,使用在高并發(fā)環(huán)境,肯定是非常不合適的。不說(shuō)別的,就說(shuō) openfire 所使用的XMPP協(xié)議。XMPP協(xié)議是一種古老的XML為基礎(chǔ)的通訊協(xié)議(古老不太適合),其弊端就是附加傳輸數(shù)據(jù)量大。并且因其復(fù)雜的通訊過(guò)程,性能會(huì)大大的降低。
另外,openfire 的基礎(chǔ)組件是使用了mina。正因?yàn)閙ina的創(chuàng)始人也是Netty的作者,正是由于看到了mina的劣勢(shì),該大牛才會(huì)自立門(mén)戶,寫(xiě)出了一個(gè)全新的Netty。
相比與機(jī)遇笨重的XML的XMPP,現(xiàn)在互聯(lián)網(wǎng)編程都是用的輕量級(jí)的JSON。所以,建議小伙伴們選擇協(xié)議的時(shí)候,考慮一下JSON的優(yōu)勢(shì)。
呵呵,肯定不止這個(gè)數(shù)。
在CPU 、內(nèi)存還不錯(cuò)的情況下,如果配置得當(dāng),單體的Netty服務(wù)器,遠(yuǎn)遠(yuǎn)不止支持10萬(wàn)并發(fā),甚至能撐到100萬(wàn)級(jí)別。
至于如何配置呢? 請(qǐng)看 此文 —— Netty 100萬(wàn)級(jí)高并發(fā)服務(wù)器配置
終于到了重要的小節(jié)了。
先上一圖,看下分布式IM系統(tǒng)的架構(gòu)。對(duì)比下和單體架構(gòu)的不同。
Netty Server 連接器
主要用來(lái)負(fù)責(zé)維持和客戶端的TCP連接
連接器集群
負(fù)責(zé) Netty Server 連接器集群的注冊(cè)、路由、負(fù)載均衡。集群IP注冊(cè)和節(jié)點(diǎn)ID分配。
緩存集群
負(fù)責(zé)用戶、用戶綁定關(guān)系、用戶群組關(guān)系的緩存。 緩存臨時(shí)數(shù)據(jù)、加快讀速度。
DB持久層集群
存在用戶、群組、離線消息
消息隊(duì)列集群
用戶狀態(tài)廣播,群組消息廣播
上面僅僅是 IM 系統(tǒng)的基本功能,還需要業(yè)務(wù)系統(tǒng)的其他功能進(jìn)行配套。比方說(shuō): 單點(diǎn)登錄訪問(wèn)系統(tǒng),完成用戶身份校驗(yàn)、加密令牌的發(fā)放、令牌簽名合法性校驗(yàn)等接口和功能檢索接口。再比方說(shuō):用戶在線管理系統(tǒng),完成管理用戶在線狀態(tài),負(fù)責(zé)統(tǒng)一保存所有用戶的在線離線狀態(tài)、保存用戶所連接的連接器。
這些個(gè)配置系統(tǒng),也應(yīng)該是分布式的。只是使用restful 短連接實(shí)現(xiàn)。
核心:
Netty4.x + spring4.x
業(yè)務(wù)配套系統(tǒng):spring cloud
基于restful 短連接的分布式微服務(wù)架構(gòu), 完成用戶在線管理、單點(diǎn)登錄系統(tǒng)。
消息隊(duì)列:
rocketMQ 高速隊(duì)列。整流作用。
底層數(shù)據(jù)庫(kù):mysql+mongodb
mysql做業(yè)務(wù)還是很方便的,用來(lái)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù),如用戶數(shù)據(jù)。
? mongodb 很重要,用來(lái)存儲(chǔ)非結(jié)構(gòu)化離線消息。
fastjson 淘寶的東西。很不錯(cuò)。目前最高效的吧。
瘋狂創(chuàng)客圈,將組織一群小伙伴,逐步實(shí)現(xiàn)整個(gè)源碼,并選擇一些重點(diǎn)的模塊設(shè)計(jì)以博文的形式公開(kāi)。
如果對(duì)源碼有興趣或者分布式設(shè)計(jì)感興趣,想?yún)⑴c到開(kāi)發(fā)過(guò)程當(dāng)中,請(qǐng)加入瘋狂創(chuàng)客圈QQ群。
聯(lián)系客服