隨著(zhù)移動(dòng)互聯(lián)網(wǎng)、AI的飛速發(fā)展,高性能高并發(fā)IM(即時(shí)通訊),有著(zhù)非常廣泛的應用場(chǎng)景。
一切高實(shí)時(shí)性通訊、消息推送的場(chǎng)景,都需要高并發(fā) IM 。
私信、聊天、大規模推送、視頻會(huì )議、彈幕、抽獎、互動(dòng)游戲、基于位置的應用(Uber、滴滴司機位置)、在線(xiàn)教育、智能家居等。

有這么多的應用場(chǎng)景,對于想成長(cháng)為JAVA高手的小伙伴們,高并發(fā)IM 都繞不開(kāi)一個(gè)話(huà)題。尤其是對于A(yíng)PP開(kāi)發(fā)的小伙伴們來(lái)說(shuō),即時(shí)通訊,已經(jīng)成為大多數APP標配。移動(dòng)互聯(lián)網(wǎng)時(shí)代,推送(Push)服務(wù)成為App應用不可或缺的重要組成部分,推送服務(wù)可以提升用戶(hù)的活躍度和留存率。我們的手機每天接收到各種各樣的廣告和提示消息等大多數都是通過(guò)推送服務(wù)實(shí)現的。
隨著(zhù)5G時(shí)代物聯(lián)網(wǎng)的發(fā)展,未來(lái)所有接入物聯(lián)網(wǎng)的智能設備,都將是IM系統的客戶(hù)端,這就意味著(zhù)推送服務(wù)未來(lái)會(huì )面臨海量的設備和終端接入。為了支持這些千萬(wàn)級、億級終端,一定是需要強悍的后臺系統。對于想在后臺有所成就的小伙伴們來(lái)說(shuō),高并發(fā)IM實(shí)戰,更是在終極BOSS PK之前的一場(chǎng)不可或缺的打怪練手。
路一步一步走,飯一口一口吃。飛起來(lái)之前的第一步,先來(lái)完成一個(gè)并發(fā)量在十萬(wàn)級別的 IM單體系統架構。
傳統的BIO模型是肯定不行的,那么就只能使用 NIO 了。和阻塞模式的OIO(old IO)相比,JAVA NIO 的原理,也是比較復雜的。瘋狂創(chuàng )客圈的這三篇 JAVA NIO 簡(jiǎn)介 | Java NIO Buffer | Java NIO Channel 文件,對JAVA NIO 做了比較詳細的介紹。
JAVA NIO本身比較復雜,如果要通過(guò)JAVA NIO 寫(xiě)一個(gè)大型的程序,更加的復雜了。于是,一個(gè)非常牛逼的框架就擺在眼前,它就是Netty。 做JAVA NIO 的編程,Netty 一定不能少。Netty 的牛逼之處,就是通過(guò) Reactor 模式、pipeline 模式 、future promise模式 這些神一級的 JAVA設計模式,對 JAVA NIO 進(jìn)行了封裝。在使用Netty之前,一定要先了解這幾大模式,一定能事半功倍。

大部分小伙伴應該都聽(tīng)說(shuō)過(guò) openfire 吧。 這個(gè)傳統的企業(yè)級開(kāi)源IM,使用在高并發(fā)環(huán)境,肯定是非常不合適的。不說(shuō)別的,就說(shuō) openfire 所使用的XMPP協(xié)議。XMPP協(xié)議是一種古老的XML為基礎的通訊協(xié)議(古老不太適合),其弊端就是附加傳輸數據量大。并且因其復雜的通訊過(guò)程,性能會(huì )大大的降低。
另外,openfire 的基礎組件是使用了mina。正因為mina的創(chuàng )始人也是Netty的作者,正是由于看到了mina的劣勢,該大牛才會(huì )自立門(mén)戶(hù),寫(xiě)出了一個(gè)全新的Netty。
相比與機遇笨重的XML的XMPP,現在互聯(lián)網(wǎng)編程都是用的輕量級的JSON。所以,建議小伙伴們選擇協(xié)議的時(shí)候,考慮一下JSON的優(yōu)勢。
呵呵,肯定不止這個(gè)數。
在CPU 、內存還不錯的情況下,如果配置得當,單體的Netty服務(wù)器,遠遠不止支持10萬(wàn)并發(fā),甚至能撐到100萬(wàn)級別。
至于如何配置呢? 請看 此文 —— Netty 100萬(wàn)級高并發(fā)服務(wù)器配置
終于到了重要的小節了。
先上一圖,看下分布式IM系統的架構。對比下和單體架構的不同。

Netty Server 連接器
主要用來(lái)負責維持和客戶(hù)端的TCP連接
連接器集群
負責 Netty Server 連接器集群的注冊、路由、負載均衡。集群IP注冊和節點(diǎn)ID分配。
緩存集群
負責用戶(hù)、用戶(hù)綁定關(guān)系、用戶(hù)群組關(guān)系的緩存。 緩存臨時(shí)數據、加快讀速度。
DB持久層集群
存在用戶(hù)、群組、離線(xiàn)消息
消息隊列集群
用戶(hù)狀態(tài)廣播,群組消息廣播
上面僅僅是 IM 系統的基本功能,還需要業(yè)務(wù)系統的其他功能進(jìn)行配套。比方說(shuō): 單點(diǎn)登錄訪(fǎng)問(wèn)系統,完成用戶(hù)身份校驗、加密令牌的發(fā)放、令牌簽名合法性校驗等接口和功能檢索接口。再比方說(shuō):用戶(hù)在線(xiàn)管理系統,完成管理用戶(hù)在線(xiàn)狀態(tài),負責統一保存所有用戶(hù)的在線(xiàn)離線(xiàn)狀態(tài)、保存用戶(hù)所連接的連接器。
這些個(gè)配置系統,也應該是分布式的。只是使用restful 短連接實(shí)現。
核心:
Netty4.x + spring4.x
業(yè)務(wù)配套系統:spring cloud
基于restful 短連接的分布式微服務(wù)架構, 完成用戶(hù)在線(xiàn)管理、單點(diǎn)登錄系統。
消息隊列:
rocketMQ 高速隊列。整流作用。
底層數據庫:mysql+mongodb
mysql做業(yè)務(wù)還是很方便的,用來(lái)存儲結構化數據,如用戶(hù)數據。
? mongodb 很重要,用來(lái)存儲非結構化離線(xiàn)消息。
fastjson 淘寶的東西。很不錯。目前最高效的吧。
瘋狂創(chuàng )客圈,將組織一群小伙伴,逐步實(shí)現整個(gè)源碼,并選擇一些重點(diǎn)的模塊設計以博文的形式公開(kāi)。
如果對源碼有興趣或者分布式設計感興趣,想參與到開(kāi)發(fā)過(guò)程當中,請加入瘋狂創(chuàng )客圈QQ群。
聯(lián)系客服