分布式、高并發(fā)、億級流量—— 瘋狂創(chuàng)客圈 死磕Netty 系列之10
億級流量IM的應用場景
隨著移動互聯(lián)網、AI的飛速發(fā)展,高性能高并發(fā)IM(即時通訊),有著非常廣泛的應用場景。
一切高實時性通訊、消息推送的場景,都需要高并發(fā) IM 。
私信、聊天、大規(guī)模推送、視頻會議、彈幕、抽獎、互動游戲、基于位置的應用(Uber、滴滴司機位置)、在線教育、智能家居等。

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

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

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