RocketMQ集群概述


1. RocketMQ集群部署結構

1) Name Server

Name Server是一個幾乎無狀態節點,可集群部署,節點之間無任何信息同步。

2) Broker

Broker部署相對復雜,Broker分為Master與Slave,一個Master可以對應多個Slave,但是一個Slave只能對應一個Master,Master與Slave的對應關系通過指定相同的Broker Name,不同的Broker Id來定義,BrokerId為0表示Master,非0表示Slave。Master也可以部署多個。

每個Broker與Name Server集群中的所有節點建立長連接,定時(每隔30s)注冊Topic信息到所有Name Server。Name Server定時(每隔10s)掃描所有存活broker的連接,如果Name Server超過2分鍾沒有收到心跳,則Name Server斷開與Broker的連接。

3) Producer

Producer與Name Server集群中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,並向提供Topic服務的Master建立長連接,且定時向Master發送心跳。Producer完全無狀態,可集群部署。

Producer每隔30s(由ClientConfig的pollNameServerInterval)從Name server獲取所有topic隊列的最新情況,這意味着如果Broker不可用,Producer最多30s能夠感知,在此期間內發往Broker的所有消息都會失敗。

Producer每隔30s(由ClientConfig中heartbeatBrokerInterval決定)向所有關聯的broker發送心跳,Broker每隔10s中掃描所有存活的連接,如果Broker在2分鍾內沒有收到心跳數據,則關閉與Producer的連接。

4) Consumer

Consumer與Name Server集群中的其中一個節點(隨機選擇)建立長連接,定期從Name Server取Topic路由信息,並向提供Topic服務的Master、Slave建立長連接,且定時向Master、Slave發送心跳。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息,訂閱規則由Broker配置決定。

Consumer每隔30s從Name server獲取topic的最新隊列情況,這意味着Broker不可用時,Consumer最多最需要30s才能感知。

Consumer每隔30s(由ClientConfig中heartbeatBrokerInterval決定)向所有關聯的broker發送心跳,Broker每隔10s掃描所有存活的連接,若某個連接2分鍾內沒有發送心跳數據,則關閉連接;並向該Consumer Group的所有Consumer發出通知,Group內的Consumer重新分配隊列,然后繼續消費。

當Consumer得到master宕機通知后,轉向slave消費,slave不能保證master的消息100%都同步過來了,因此會有少量的消息丟失。但是一旦master恢復,未同步過去的消息會被最終消費掉。

消費者對列是消費者連接之后(或者之前有連接過)才創建的。我們將原生的消費者標識由 {IP}@{消費者group}擴展為 {IP}@{消費者group}{topic}{tag},(例如xxx.xxx.xxx.xxx@mqtest_producer-group_2m2sTest_tag-zyk)。任何一個元素不同,都認為是不同的消費端,每個消費端會擁有一份自己消費對列(默認是broker對列數量*broker數量)。新掛載的消費者對列中擁有commitlog中的所有數據。

如果有需要,可以查看Rocketmq更多源碼解析



作者:彥幀
鏈接:https://www.jianshu.com/p/2838890f3284


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM