瘋狂創客圈,一個Java 高併發研習社羣 【博客園 總入口 】html
瘋狂創客圈,傾力推出:面試必備 + 面試必備 + 面試必備 的基礎原理+實戰 書籍 《Netty Zookeeper Redis 高併發實戰》mysql
順便說明下:
本文的內容只是一個初稿、初稿,本文的知識,在《Netty Zookeeper Redis 高併發實戰》一書時,進行大篇幅的完善和更新,而且進行的源碼的升級。 博客和書不同,書的內容更加系統化、全面化,更加層層升入、井井有條、更屢次的錯誤排查,請你們以書的內容爲準。
本文的最終內容, 具體請參考瘋狂創客圈 傾力編著,機械工業出版社出版的 《Netty Zookeeper Redis 高併發實戰》一書 。
面試
更重要的是,本文的架構設計和源碼,在寫《Netty Zookeeper Redis 高併發實戰》一書時,已經迭代更新了幾輪,架構和尤爲是源碼的 實現,以隨書源碼爲準。spring
隨着移動互聯網、AI的飛速發展,高性能高併發IM(即時通信),有着很是普遍的應用場景。sql
一切高實時性通信、消息推送的場景,都須要高併發 IM 。mongodb
私信、聊天、大規模推送、視頻會議、彈幕、抽獎、互動遊戲、基於位置的應用(Uber、滴滴司機位置)、在線教育、智能家居等。數據庫
有這麼多的應用場景,對於想成長爲JAVA高手的小夥伴們,高併發IM 都繞不開一個話題。尤爲是對於APP開發的小夥伴們來講,即時通信,已經成爲大多數APP標配。移動互聯網時代,推送(Push)服務成爲App應用不可或缺的重要組成部分,推送服務能夠提高用戶的活躍度和留存率。咱們的手機天天接收到各類各樣的廣告和提示消息等大多數都是經過推送服務實現的。編程
隨着5G時代物聯網的發展,將來全部接入物聯網的智能設備,都將是IM系統的客戶端,這就意味着推送服務將來會面臨海量的設備和終端接入。爲了支持這些千萬級、億級終端,必定是須要強悍的後臺系統。對於想在後臺有所成就的小夥伴們來講,高併發IM實戰,更是在終極BOSS PK以前的一場不可或缺的打怪練手。json
路一步一步走,飯一口一口吃。飛起來以前的第一步,先來完成一個併發量在十萬級別的 IM單體系統架構。設計模式
傳統的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的優點。
呵呵,確定不止這個數。
在CPU 、內存還不錯的狀況下,若是配置得當,單體的Netty服務器,遠遠不止支持10萬併發,甚至能撐到100萬級別。
至於如何配置呢? 請看 此文 —— Netty 100萬級高併發服務器配置
終於到了重要的小節了。
先上一圖,看下分佈式IM系統的架構。對比下和單體架構的不一樣。
Netty Server 鏈接器
主要用來負責維持和客戶端的TCP鏈接
鏈接器集羣
負責 Netty Server 鏈接器集羣的註冊、路由、負載均衡。集羣IP註冊和節點ID分配。
緩存集羣
負責用戶、用戶綁定關係、用戶羣組關係的緩存。 緩存臨時數據、加快讀速度。
DB持久層集羣
存在用戶、羣組、離線消息
消息隊列集羣
用戶狀態廣播,羣組消息廣播
上面僅僅是 IM 系統的基本功能,還須要業務系統的其餘功能進行配套。比方說: 單點登陸訪問系統,完成用戶身份校驗、加密令牌的發放、令牌簽名合法性校驗等接口和功能檢索接口。再比方說:用戶在線管理系統,完成管理用戶在線狀態,負責統一保存全部用戶的在線離線狀態、保存用戶所鏈接的鏈接器。
這些個配置系統,也應該是分佈式的。只是使用restful 短鏈接實現。
核心:
Netty4.x + spring4.x
業務配套系統:spring cloud
基於restful 短鏈接的分佈式微服務架構, 完成用戶在線管理、單點登陸系統。
消息隊列:
rocketMQ 高速隊列。整流做用。
底層數據庫:mysql+mongodb
mysql作業務仍是很方便的,用來存儲結構化數據,如用戶數據。
mongodb 很重要,用來存儲非結構化離線消息。
協議JSON +自定義數據包
fastjson 淘寶的東西。很不錯。目前最高效的吧。
瘋狂創客圈,將組織一羣小夥伴,逐步實現整個源碼,並選擇一些重點的模塊設計以博文的形式公開。
若是對源碼有興趣或者分佈式設計感興趣,想參與到開發過程中,請加入瘋狂創客圈QQ羣。
無編程不創客,無案例不學習。瘋狂創客圈,一大波高手正在交流、學習中!
瘋狂創客圈 Netty 死磕系列 10多篇深度文章: 博客園 總入口 QQ羣:104131248**