RocketMQ設計原理分析

RocketMQ3.x及以前版本由阿里維護,RocketMQ4.x及以後版本是捐贈給Apache社區,孵化成爲Apache頂級項目的版本號,這一點從RocketMQ客戶端的包名由com.alibaba改爲org.apache可以得到證實。本文主要從設計原理上對RocketMQ進行分析。

一、RocketMQ發送消息三種方式:同步發送、異步發送、單向(Oneway)發送

1、同步發送

同步發送是指消息發送方發出數據後,會在收到接收方發回響應之後才發下一個數據包的通訊方式。此種方式應用場景非常廣泛,例如重要通知郵件、短信系統等。

2、異步發送

異步發送是指發送方發出數據後,不等接收方發回響應,接着可以發送下個數據包的通訊方式。消息發送方在發送了一條消息後,不需要等待Broker響應即可進行接下來的業務處理。發送方通過回調接口SendCallback接收Broker響應,並對響應結果進行處理。異步發送一般用於鏈路耗時較長,對 RT 響應時間較爲敏感的業務場景。

3、單向(Oneway)發送

單向發送特點爲發送方只負責發送消息,不需要Broker應答。適用於對可靠性要求並不高的場景,例如日誌收集。

二、RocketMQ兩種消費模式:集羣消費、廣播消費

1、集羣消費

多個consumer平均消費該topic下所有mq的消息,即某個消息在某個message queue中被一個consumer消費後,其他消費者就不會消費到它。

2、廣播消費

所有consumer可以消費到發到這個topic下的所有消息。

三、RocketMQ常見部署結構

1、Name Server

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

2、Broker

Broker是RocketMQ的核心,大部分“重量級”的工作都是由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從Name server獲取所有topic隊列的最新情況,這意味着如果Broker不可用,Producer最長30s時間能夠感知,在此期間內發往Broker的所有消息都會失敗。

Producer每隔30s向所有關聯的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向所有關聯的Broker發送心跳,Broker每隔10s掃描所有存活的連接,若某個連接2分鐘內沒有發送心跳數據,則關閉連接;並向該Consumer Group的所有Consumer發出通知,Group內的Consumer重新分配隊列,然後繼續消費。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章