RocketMQ基礎架構
基於官方文件進行翻譯
概覽
Apache RocketMQ是一個分散式訊息和流平臺,它的特性包括低延遲,高效能,高可靠性,萬億級容量和彈性擴充套件。它的架構主要包括四部分:命名服務(name servers),代理服務(brokers),生產者(Producers),消費者(Consumers)。其中每個部分都是可以水平擴充套件從而避免單點故障。如圖所示:

image.png
命名服務叢集
命名服務提供了輕量的服務用於發現和路由。每個命名服務都記錄了全量的路由資訊,提供了讀寫一致性的服務,並且支援快速儲存擴充套件。
代理服務叢集
代理服務利用輕量的話題(TOPIC)和佇列(QUEUE)機制來儲存訊息。代理服務能夠支援推(Push)和拉(Pull)的模式,利用多拷貝來支援容錯(2份或者3分拷貝),提供強大的峰值填充和以原始時間順序堆積萬億數量級訊息。並且代理服務還具備一些傳統訊息系統沒有的特性,比如災難恢復,多維度統計,預警機制等。
生產者叢集
生產者支援分散式部署。分散式生產者通過負載均衡將資訊傳送到代理服務叢集,傳送程序支援快速失敗(fail fast)以及低延遲。
消費者叢集
消費者也能夠在推拉模式中也能夠支援分散式部署,並且支援叢集消費以及訊息廣播。這種方式也提供了實時訊息訂閱機制,能夠滿足大部分消費者的需求。RocketMQ的官網也提供了相關的網頁給有興趣的使用者。
命名服務
命名服務是純粹的功能性伺服器,主要包含2個特性:
-
代理管理, 命名服務 接受代理服務叢集的註冊,同時通過心跳機制來檢查單個代理的有效性
-
路由管理,每個路由服務都儲存了代理叢集完整的路由資訊以及客戶端查詢所需要的佇列資訊。RocketMQ的客戶端(生產者/消費者)會從命名服務獲取佇列路由資訊,但是客戶端如何獲取命名服務的地址?
下面有4個方法將命名服務地址推流至客戶端:
-
硬編碼,如
producer.setNamesAddr("ip:port")
. -
Java執行引數,使用
rocketmq.namesrv.addr
。 -
環境變數,使用
NAMESRV_ADDR
。 -
HTTP的終點(Endpoint)。
點選這裡檢視更多關於命名服務的細節文件。
代理服務
代理服務負責訊息儲存和分發,訊息查詢,高可用等等。
如下圖所示,代理服務包含幾個重要的子模組:
-
遠端模組,代理服務入口,處理客戶端傳送的請求。
-
客戶端管理,管理客戶端(生產者/消費者)並且維護消費者訂閱。
-
儲存服務,為儲存在物理硬碟上的訊息提供簡單的儲存或查詢介面。
-
高可用服務,在主代理和從代理直接提供資料同步功能。
-
索引服務,根據特定的key對訊息進行索引構建,用於提供訊息的快速檢索。

image.png