整理了一些RocketMQ相關流程圖/原理圖,作一下筆記,你們一塊兒學習。html
RocketMQ是開源的消息中間件,它主要由NameServer,Producer,Broker,Consumer四部分構成。 java
NameServer主要負責Topic和路由信息的管理,功能相似Dubbo的zookeeper。數組
消息生產者,負責產生消息,通常由業務系統負責產生消息。緩存
消息中轉角色,負責存儲消息,轉發消息。服務器
消息消費者,負責消息消費,通常是後臺系統負責異步消費。數據結構
NameServer是一個幾乎無狀態節點,可集羣部署,節點之間無任何信息同步。架構
Broker分爲Master與Slave,一個Master能夠對應多個Slave,可是一個Slave只能對應一個Master,Master與Slave的對應關係經過指定相同的BrokerName,不一樣的BrokerId來定義,BrokerId爲0表示Master,非0表示Slave。Master也能夠部署多個。每一個Broker與Name Server集羣中的全部節點創建長鏈接,定時註冊Topic信息到全部Name Server。app
Producer與Name Server集羣中的其中一個節點(隨機選擇)創建長鏈接,按期從Name Server取Topic路由信息,並向提供Topic服務的Master創建長鏈接,且定時向Master發送心跳。Producer徹底無狀態,可集羣部署。運維
Consumer與Name Server集羣中的其中一個節點(隨機選擇)創建長鏈接,按期從Name Server取Topic路由信息,並向提供Topic服務的Master、Slave創建長鏈接,且定時向Master、Slave發送心跳。Consumer既能夠從Master訂閱消息,也能夠從Slave訂閱消息,訂閱規則由Broker配置決定。異步
用來表示一個發送消息應用,一個 Producer Group 下包含多個 Producer 實例,能夠是多臺機器,也能夠 是一臺機器的多個進程,或者一個進程的多個 Producer 對象。一個 Producer Group 能夠發送多個 Topic 消息,Producer Group 做用以下:
用來表示一個消費消息應用,一個 Consumer Group 下包含多個 Consumer 實例,能夠是多臺機器,也可 以是多個進程,或者是一個進程的多個 Consumer 對象。一個 Consumer Group 下的多個 Consumer 以均攤 方式消費消息,若是設置爲廣播方式,那麼這個 Consumer Group 下的每一個實例都消費全量數據。
Tag表示消息的第二級類型,好比交易消息又能夠分爲:交易建立消息,交易完成消息等。RocketMQ提供2級消息分類,方便靈活控制。
組,一個組能夠訂閱多個Topic。
消息的物理管理單位。一個Topic下能夠有多個Queue,Queue的引入使得消息的存儲能夠分佈式集羣化,具備了水平擴展能力。
在 RocketMQ 中,全部消息隊列都是持久化,長度無限的數據結構,所謂長度無限是指隊列中的每一個存儲單元都是定長,訪問其中的存儲單元使用 Offset 來訪問,offset 爲 java long 類型,64 位,理論上在 100年內不會溢出,因此認爲是長度無限。
也能夠認爲 Message Queue 是一個長度無限的數組,Offset 就是下標。
消費消息的順序要同發送消息的順序一致,在 RocketMQ 中,主要的是局部順序,即一類消息爲知足順 序性,必須 Producer 單線程順序發送,且發送到同一個隊列,這樣 Consumer 就能夠按照 Producer 收送 的順序去消費消息。
消息存儲文件,全部消息主題的消息都存儲在 CommitLog 文件中。 Commitlog 文件存儲的邏輯視圖如圖所示
消息消費隊列,消息到達 CommitLog 文件後,將異步轉發到消息 消費隊列,供消息消費者消費。ConsumeQueue存儲格式以下:
消息索引文件,主要存儲消息 Key 與 Offset 的對應關係。
消息消費隊列是RocketMQ專門爲消息訂閱構建的索引文件,提升根據主題與消息隊 列檢索消息的速度 ,另外 RocketMQ 引入了 Hash 索引機制爲消息創建索引, HashMap 的設 計包含兩個基本點 : Hash 槽與 Hash 衝突的鏈表結構。 RocketMQ 索引文件佈局如圖所示
lndexFile 總共包含 lndexHeader、 Hash 槽、 Hash 條目
存儲每條消息的事務狀態。
每個延遲級別對應一個消息消費隊列,存儲延遲隊列的消息拉取進度。
Broker端對消息進行讀取和寫入的業務邏輯入口,這一層主要包含了業務邏輯相關處理操做(根據解析RemotingCommand中的RequestCode來區分具體的業務操做類型,進而執行不一樣的業務處理流程),好比前置的檢查和校驗步驟、構造MessageExtBrokerInner對象、decode反序列化、構造Response返回對象等。
主要指的是部署RocketMQ服務器所用的磁盤。這裏,須要考慮不一樣磁盤類型(如SSD或者普通的HDD)特性以及磁盤的性能參數(如IOPS、吞吐量和訪問時延等指標)對順序寫/隨機讀操做帶來的影響。
在RocketMQ中消息刷盤主要能夠分爲同步刷盤和異步刷盤兩種。
1.Producer 發送消息,消息從 socket 進入 java 堆。
2.Producer 發送消息,消息從 java 堆轉入 PAGACACHE,物理內存。
3.Producer 發送消息,由異步線程刷盤,消息從 PAGECACHE 刷入磁盤。
4.Consumer 拉消息(正常消費),消息直接從 PAGECACHE(數據在物理內存)轉入 socket,到達 consumer, 不通過 java 堆。這種消費場景最多,線上 96G 物理內存,按照 1K 消息算,能夠在物理內存緩存 1 億條消 息。
5.Consumer 拉消息(異常消費),消息直接從 PAGECACHE(數據在虛擬內存)轉入 socket。
6.Consumer 拉消息(異常消費),因爲 Socket 訪問了虛擬內存,產生缺頁中斷,此時會產生磁盤 IO,從磁 盤 Load 消息到 PAGECACHE,而後直接從 socket 發出去。
7.同 5 一致。
8.同 6 一致。
歡迎你們關注,你們一塊兒學習,一塊兒討論。