消息隊(duì)列中間件是分布式系統(tǒng)中重要的組件,主要解決應(yīng)用耦合,異步消息,流量削鋒等問題實(shí)現(xiàn)高性能,高可用,可伸縮和最終一致性架構(gòu)。使用較多的消息隊(duì)列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ,這里主要介紹下RocketMQ。RocketMQ的前身是Metaq,3.0后更名為RocketMQ,apache地址為:http://rocketmq.apache.org/
RocketMQ是什么?
看下Apache上關(guān)于RocketMQ的介紹:RocketMQ是一款低延遲、高可靠、可伸縮、易于使用的消息中間件。具有以下特征:
1.支持發(fā)布/訂閱(Pub/Sub)和點(diǎn)對(duì)點(diǎn)(P2P)消息模型
2.在一個(gè)隊(duì)列中可靠的先進(jìn)先出(FIFO)和嚴(yán)格的順序傳遞? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
3.支持拉pull和推push兩種消費(fèi)方式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
4.單一隊(duì)列百萬消息的堆積能力? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
5.支持多種消息協(xié)議,如 JMS、MQTT 等? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
6.分布式高可用的部署架構(gòu),滿足至少一次消息傳遞語義? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
7.提供 docker 鏡像用于隔離測(cè)試和云集群部署? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
8.提供配置、指標(biāo)和監(jiān)控等功能豐富的 Dashboard
RocketMQ架構(gòu)
?RocketMQ主要由三部分組成:client(producer,consumer),broker,nameServer,如下架構(gòu)圖所示:

從上圖可以看出每一部分都為集群,當(dāng)然也可以部署為單點(diǎn)。集群的部署方式增加了系統(tǒng)的可靠性和吞吐量。
NameServer:MQ集群服務(wù)的治理者和協(xié)調(diào)者,相當(dāng)于zookeeper之于kafka。
Broker:通過提供輕量級(jí)的Topic和Queue機(jī)制來存儲(chǔ)和處理消息。上圖中可以看到broker可以提供主從方式以保證消息的可靠性,可以1主1從,也可以1主多從,主能讀寫,從只能讀。主從之間消息同步可以采取同步或者異步,同步可靠性更高,異步效率更高,可根據(jù)實(shí)際情況選擇。筆者從事于電商公司,選擇的是主從同步復(fù)制。
Producer:即消息的發(fā)送者,生產(chǎn)者將消息組裝,從NameServer獲取Topic的路由信息,然后將消息發(fā)送到具體的broker,broker收到消息后,采用同步刷盤或者異步刷盤的模式持久到本地磁盤。
Consumer:即消息消費(fèi)方。consumer是以組(ConsumerGroup)為單位消費(fèi)消息的,即一個(gè)消息只能被同一消費(fèi)組下一個(gè)消費(fèi)者消費(fèi)。消費(fèi)者通過NameServer獲取需要消費(fèi)的topic的broker信息,與之建立連接,輪訓(xùn)試的訪問是否有消息到來從而消費(fèi),push是pull的一種變種,只是單獨(dú)起了一個(gè)線程負(fù)責(zé)拉取消息而已。
到這里為止,相信大家已經(jīng)對(duì)RocketMQ有了一個(gè)簡(jiǎn)單的概念,后面即將揭開每一部分的實(shí)現(xiàn)原理,及解析部分源碼。
參考文章鏈接:RocketMQ 實(shí)戰(zhàn)之快速入門
? ? ? ? ? ? ? ? ? ? ? ? ?消息隊(duì)列的使用場(chǎng)景