RocketMQ 是阿里巴巴開源的分布式消息中間件。
RocketMQ 特點(diǎn)
- 是一個隊(duì)列模型的消息中間件钝腺,具有高性能抛姑、高可靠、高實(shí)時艳狐、分布式等特點(diǎn)
- Producer定硝、Consumer、隊(duì)列都可以分布式
- Producer 向一些隊(duì)列輪流發(fā)送消息毫目,隊(duì)列集合稱為 Topic蔬啡,Consumer 如果做廣播消費(fèi),則一個 Consumer 實(shí)例消費(fèi)這個 Topic 對應(yīng)的所有隊(duì)列镀虐,如果做集群消費(fèi)箱蟆,則多個 Consumer 實(shí)例平均消費(fèi)這個 Topic 對應(yīng)的隊(duì)列集合
- 能夠保證嚴(yán)格的消息順序
- 支持拉(pull)和推(push)兩種消息模式
- 高效的訂閱者水平擴(kuò)展能力
- 實(shí)時的消息訂閱機(jī)制
- 億級消息堆積能力
- 支持多種消息協(xié)議,如 JMS粉私、OpenMessaging 等
- 較少的依賴
RocketMQ 核心概念
Producer
消息生產(chǎn)者顽腾,將業(yè)務(wù)系統(tǒng)生成的消息發(fā)送給消息代理(Broker),RocketMQ 提供了多種發(fā)送消息的模式:同步(synchronous)诺核、異步(asynchronous)和單向(one-way)抄肖。Producer Group
消息生產(chǎn)者組,具有相同角色的消息生產(chǎn)者組合在一起窖杀,相同角色可以理解為生產(chǎn)同一類消息漓摩。Consumer
消息消費(fèi)者,從消息代理(Broker)獲取消息并將其提供給應(yīng)用程序入客。又可以根據(jù)消息獲取方式分為:
(1) Pull Consumer
積極主動地從消息代理(Broker)中拉取消息管毙,一旦批量消息被拉出腿椎,用戶應(yīng)用便啟動消息。
(2) Push Consumer
將拉動消息夭咬、消費(fèi)進(jìn)度和其它維護(hù)工作封裝起來啃炸,留下一個回調(diào)接口給最終用戶實(shí)現(xiàn),這個接口在消息到達(dá)時會被執(zhí)行卓舵。Consumer Group
消息消費(fèi)者組南用,同消息生產(chǎn)者組類似,將具有相同角色的消息消費(fèi)者組合在一起掏湾,相同角色可以理解為消費(fèi)同一類消息裹虫。Topic
Topic 是消息的邏輯分類。Message
Message 是發(fā)送的信息載體融击,Message 必須指定 Topic筑公,可以類比信件地址。Message 有一個可選的 Tag 設(shè)置便于過濾消息尊浪,還可以添加額外的鍵值對匣屡。Message Queue
Topic 會被分為一個或多個 Message QueueTag
Tag 是 Topic 的進(jìn)一步細(xì)分,為用戶提供額外的靈活性际长。同一業(yè)務(wù)不同目的的消息可以擁有相同的 Topic 和不同的 Tag耸采。Broker
Broker 是 RocketMQ 系統(tǒng)主要組件,接收來自消息生產(chǎn)者的消息工育,存儲這些消息并為消息消費(fèi)者拉動這些消息做準(zhǔn)備虾宇,也存儲消息相關(guān)元數(shù)據(jù)。Name Server
Name Server 為消息生產(chǎn)者和消費(fèi)者提供路由信息如绸。Message Model
消息模型:集群(Clustering)和廣播(Broadcasting)Message Order
消息順序:順序(Orderly)和并發(fā)(Concurrently)
RocketMQ 架構(gòu)
RocketMQ 架構(gòu)圖中展示了四個集群:
NameServer 集群
提供輕量級的服務(wù)發(fā)現(xiàn)及路由嘱朽,每個 NameServer 記錄完整的路由信息,提供相應(yīng)的讀寫服務(wù)怔接,支持快速存儲擴(kuò)展搪泳。有些其它開源中間件使用 ZooKeeper 實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及路由功能,如 Apache Kafka扼脐。
NameServer是一個功能齊全的服務(wù)器岸军,主要包含兩個功能:
(1) Broker 管理,接收來自 Broker 集群的注冊請求瓦侮,提供心跳機(jī)制檢測 Broker 是否存活
(2) 路由管理艰赞,每個 NameServer 持有全部有關(guān) Broker 集群和客戶端請求隊(duì)列的路由信息Broker 集群
通過提供輕量級的 Topic 和Queue 機(jī)制處理消息存儲。同時支持推(Push)和拉(Pull)兩種模型肚吏,包含容錯機(jī)制方妖。提供強(qiáng)大的峰值填充和以原始時間順序累積數(shù)千億條消息的能力。此外還提供災(zāi)難恢復(fù)罚攀,豐富的指標(biāo)統(tǒng)計(jì)數(shù)據(jù)和警報機(jī)制党觅,這些都是傳統(tǒng)的消息系統(tǒng)缺乏的雌澄。
Broker 有幾個重要的子模塊:
(1) 遠(yuǎn)程處理模塊,Broker 入口杯瞻,處理來自客戶端的請求
(2) 客戶端管理镐牺,管理客戶端(包括消息生產(chǎn)者和消費(fèi)者),維護(hù)消費(fèi)者的主題訂閱
(3) 存儲服務(wù)魁莉,提供在物理硬盤上存儲和查詢消息的簡單 API
(4) HA 服務(wù)任柜,提供主從 Broker 間數(shù)據(jù)同步
(5) 索引服務(wù),通過指定鍵為消息建立索引并提供快速消息查詢Producer 集群
消息生產(chǎn)者支持分布式部署沛厨,分布式生產(chǎn)者通過多種負(fù)載均衡模式向 Broker 集群發(fā)送消息。Consumer 集群
消息消費(fèi)者也支持 Push 和 Pull 模型的分布式部署摔认,還支持集群消費(fèi)和消息廣播逆皮。提供了實(shí)時的消息訂閱機(jī)制,可以滿足大多數(shù)消費(fèi)者的需求参袱。
有關(guān)架構(gòu)圖中集群間交互方式的說明:
(1) Broker Master 和 Broker Slave 是主從結(jié)構(gòu)电谣,會執(zhí)行數(shù)據(jù)同步 Data Sync
(2) 每個 Broker 與 NameServer 集群中所有節(jié)點(diǎn)建立長連接,定時注冊 Topic 信息到所有 NameServer
(3) Producer 與 NameServer 集群中的其中一個節(jié)點(diǎn)(隨機(jī))建立長連接抹蚀,定期從 NameServer 獲取 Topic 路由信息剿牺,并與提供 Topic 服務(wù)的 Broker Master 建立長連接,定時向 Broker 發(fā)送心跳
(4) Producer 只能將消息發(fā)送到 Broker Master环壤,但是 Consumer 同時和提供 Topic 服務(wù)的 Master 和 Slave 建立長連接晒来,既可以從 Master 訂閱消息,也可以從 Slave 訂閱消息郑现。
有關(guān) RocketMQ 的更多資料可以參看:
Apache RocketMQ
RocketMQ on Github
阿里中間件團(tuán)隊(duì)博客之十分鐘入門 RocketMQ