RocketMQ 是阿里巴巴開源的分布式消息中間件。
RocketMQ 特點
- 是一個隊列模型的消息中間件,具有高性能、高可靠、高實時、分布式等特點
- Producer、Consumer、隊列都可以分布式
- Producer 向一些隊列輪流發送消息,隊列集合稱為 Topic,Consumer 如果做廣播消費,則一個 Consumer 實例消費這個 Topic 對應的所有隊列,如果做集群消費,則多個 Consumer 實例平均消費這個 Topic 對應的隊列集合
- 能夠保證嚴格的消息順序
- 支持拉(pull)和推(push)兩種消息模式
- 高效的訂閱者水平擴展能力
- 實時的消息訂閱機制
- 億級消息堆積能力
- 支持多種消息協議,如 JMS、OpenMessaging 等
- 較少的依賴
RocketMQ 核心概念
Producer
消息生產者,將業務系統生成的消息發送給消息代理(Broker),RocketMQ 提供了多種發送消息的模式:同步(synchronous)、異步(asynchronous)和單向(one-way)。Producer Group
消息生產者組,具有相同角色的消息生產者組合在一起,相同角色可以理解為生產同一類消息。Consumer
消息消費者,從消息代理(Broker)獲取消息并將其提供給應用程序。又可以根據消息獲取方式分為:
(1) Pull Consumer
積極主動地從消息代理(Broker)中拉取消息,一旦批量消息被拉出,用戶應用便啟動消息。
(2) Push Consumer
將拉動消息、消費進度和其它維護工作封裝起來,留下一個回調接口給最終用戶實現,這個接口在消息到達時會被執行。Consumer Group
消息消費者組,同消息生產者組類似,將具有相同角色的消息消費者組合在一起,相同角色可以理解為消費同一類消息。Topic
Topic 是消息的邏輯分類。Message
Message 是發送的信息載體,Message 必須指定 Topic,可以類比信件地址。Message 有一個可選的 Tag 設置便于過濾消息,還可以添加額外的鍵值對。Message Queue
Topic 會被分為一個或多個 Message QueueTag
Tag 是 Topic 的進一步細分,為用戶提供額外的靈活性。同一業務不同目的的消息可以擁有相同的 Topic 和不同的 Tag。Broker
Broker 是 RocketMQ 系統主要組件,接收來自消息生產者的消息,存儲這些消息并為消息消費者拉動這些消息做準備,也存儲消息相關元數據。Name Server
Name Server 為消息生產者和消費者提供路由信息。Message Model
消息模型:集群(Clustering)和廣播(Broadcasting)Message Order
消息順序:順序(Orderly)和并發(Concurrently)
RocketMQ 架構
RocketMQ 架構圖中展示了四個集群:
NameServer 集群
提供輕量級的服務發現及路由,每個 NameServer 記錄完整的路由信息,提供相應的讀寫服務,支持快速存儲擴展。有些其它開源中間件使用 ZooKeeper 實現服務發現及路由功能,如 Apache Kafka。
NameServer是一個功能齊全的服務器,主要包含兩個功能:
(1) Broker 管理,接收來自 Broker 集群的注冊請求,提供心跳機制檢測 Broker 是否存活
(2) 路由管理,每個 NameServer 持有全部有關 Broker 集群和客戶端請求隊列的路由信息Broker 集群
通過提供輕量級的 Topic 和Queue 機制處理消息存儲。同時支持推(Push)和拉(Pull)兩種模型,包含容錯機制。提供強大的峰值填充和以原始時間順序累積數千億條消息的能力。此外還提供災難恢復,豐富的指標統計數據和警報機制,這些都是傳統的消息系統缺乏的。
Broker 有幾個重要的子模塊:
(1) 遠程處理模塊,Broker 入口,處理來自客戶端的請求
(2) 客戶端管理,管理客戶端(包括消息生產者和消費者),維護消費者的主題訂閱
(3) 存儲服務,提供在物理硬盤上存儲和查詢消息的簡單 API
(4) HA 服務,提供主從 Broker 間數據同步
(5) 索引服務,通過指定鍵為消息建立索引并提供快速消息查詢Producer 集群
消息生產者支持分布式部署,分布式生產者通過多種負載均衡模式向 Broker 集群發送消息。Consumer 集群
消息消費者也支持 Push 和 Pull 模型的分布式部署,還支持集群消費和消息廣播。提供了實時的消息訂閱機制,可以滿足大多數消費者的需求。
有關架構圖中集群間交互方式的說明:
(1) Broker Master 和 Broker Slave 是主從結構,會執行數據同步 Data Sync
(2) 每個 Broker 與 NameServer 集群中所有節點建立長連接,定時注冊 Topic 信息到所有 NameServer
(3) Producer 與 NameServer 集群中的其中一個節點(隨機)建立長連接,定期從 NameServer 獲取 Topic 路由信息,并與提供 Topic 服務的 Broker Master 建立長連接,定時向 Broker 發送心跳
(4) Producer 只能將消息發送到 Broker Master,但是 Consumer 同時和提供 Topic 服務的 Master 和 Slave 建立長連接,既可以從 Master 訂閱消息,也可以從 Slave 訂閱消息。
有關 RocketMQ 的更多資料可以參看:
Apache RocketMQ
RocketMQ on Github
阿里中間件團隊博客之十分鐘入門 RocketMQ
下一篇:RocketMQ 安裝部署及運行