1. 程式人生 > >仿微信 IM後臺(億級流量高併發) 瘋狂實戰

仿微信 IM後臺(億級流量高併發) 瘋狂實戰

仿微信 億級流量 IM後臺 實戰

分散式、高併發、億級流量—— 瘋狂創客圈 死磕Netty 系列之10

億級流量IM的應用場景

隨著移動網際網路、AI的飛速發展,高效能高併發IM(即時通訊),有著非常廣泛的應用場景。

一切高實時性通訊、訊息推送的場景,都需要高併發 IM 。

私信、聊天、大規模推送、視訊會議、彈幕、抽獎、互動遊戲、基於位置的應用(Uber、滴滴司機位置)、線上教育、智慧家居等。

在這裡插入圖片描述

有這麼多的應用場景,對於想成長為JAVA高手的小夥伴們,高併發IM 都繞不開一個話題。尤其是對於APP開發的小夥伴們來說,即時通訊,已經成為大多數APP標配。移動網際網路時代,推送(Push)服務成為App應用不可或缺的重要組成部分

,推送服務可以提升使用者的活躍度和留存率。我們的手機每天接收到各種各樣的廣告和提示訊息等大多數都是通過推送服務實現的。

隨著5G時代物聯網的發展,未來所有接入物聯網的智慧裝置,都將是IM系統的客戶端,這就意味著推送服務未來會面臨海量的裝置和終端接入。為了支援這些千萬級、億級終端,一定是需要強悍的後臺系統。對於想在後臺有所成就的小夥伴們來說,高併發IM實戰,更是在終極BOSS PK之前的一場不可或缺的打怪練手。


十萬級 單體IM 系統

路一步一步走,飯一口一口吃。飛起來之前的第一步,先來完成一個併發量在十萬級別的 IM單體系統架構

首先是IO模型

傳統的BIO模型是肯定不行的,那麼就只能使用 NIO 了。和阻塞模式的OIO(old IO)相比,JAVA NIO 的原理,也是比較複雜的。瘋狂創客圈的這三篇

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之前,一定要先了解這幾大模式,一定能事半功倍。
在這裡插入圖片描述

其次是通訊協議

大部分小夥伴應該都聽說過 openfire 吧。 這個傳統的企業級開源IM,使用在高併發環境,肯定是非常不合適的。不說別的,就說 openfire 所使用的XMPP協議。XMPP協議是一種古老的XML為基礎的通訊協議(古老不太適合),其弊端就是附加傳輸資料量大。並且因其複雜的通訊過程,效能會大大的降低。

另外,openfire 的基礎元件是使用了mina。正因為mina的創始人也是Netty的作者,正是由於看到了mina的劣勢,該大牛才會自立門戶,寫出了一個全新的Netty。

相比與機遇笨重的XML的XMPP,現在網際網路程式設計都是用的輕量級的JSON。所以,建議小夥伴們選擇協議的時候,考慮一下JSON的優勢。

單體Netty服務, 僅僅支援十萬級的併發嗎?

呵呵,肯定不止這個數。

在CPU 、記憶體還不錯的情況下,如果配置得當,單體的Netty伺服器,遠遠不止支援10萬併發,甚至能撐到100萬級別

至於如何配置呢? 請看 此文 —— Netty 100萬級高併發伺服器配置


高併發分散式IM系統架構

終於到了重要的小節了。

先上一圖,看下分散式IM系統的架構。對比下和單體架構的不同。

在這裡插入圖片描述

分散式IM的五大元件

  • Netty Server 聯結器
    主要用來負責維持和客戶端的TCP連線

  • 聯結器叢集
    負責 Netty Server 聯結器叢集的註冊、路由、負載均衡。叢集IP註冊和節點ID分配。

  • 快取叢集

    負責使用者、使用者繫結關係、使用者群組關係的快取。 快取臨時資料、加快讀速度。

  • DB持久層叢集

    存在使用者、群組、離線訊息

  • 訊息佇列叢集

    使用者狀態廣播,群組訊息廣播


業務系統配套功能

上面僅僅是 IM 系統的基本功能,還需要業務系統的其他功能進行配套。比方說: 單點登入訪問系統,完成使用者身份校驗、加密令牌的發放、令牌簽名合法性校驗等介面和功能檢索介面。再比方說:使用者線上管理系統,完成管理使用者線上狀態,負責統一儲存所有使用者的線上離線狀態、儲存使用者所連線的聯結器。

這些個配置系統,也應該是分散式的。只是使用restful 短連線實現。


高併發分散式IM系統實戰——技術選型

  • 核心:

    Netty4.x + spring4.x

  • 業務配套系統:spring cloud

    基於restful 短連線的分散式微服務架構, 完成使用者線上管理、單點登入系統。

  • 訊息佇列:

    rocketMQ 高速佇列。整流作用。

  • 底層資料庫:mysql+mongodb

    mysql做業務還是很方便的,用來儲存結構化資料,如使用者資料。

​ mongodb 很重要,用來儲存非結構化離線訊息。

  • 協議JSON +自定義資料包

fastjson 淘寶的東西。很不錯。目前最高效的吧。


實戰計劃

瘋狂創客圈,將組織一群小夥伴,逐步實現整個原始碼,並選擇一些重點的模組設計以博文的形式公開。

如果對原始碼有興趣或者分散式設計感興趣,想參與到開發過程當中,請加入瘋狂創客圈QQ群。


無程式設計不創客,無案例不學習。瘋狂創客圈,大段程式設計、大口吃肉!

瘋狂創客圈 交流: 【部落格園 總入口】 QQ群:104131248**