RocketMQ 架構(gòu)簡(jiǎn)析

整體架構(gòu)
-
路由元信息
-
topicQueueTable:topic 消息隊(duì)列路由信息。 -
brokerAddrTable:broker基礎(chǔ)信息。包含broker name,所屬集群名稱,主broker地址等。 -
clusterAddrTable:broker集群信息,存儲(chǔ)集群中所有broker的名稱。 -
brokerLiveTable:broker狀態(tài)信息。 -
filterServerTable:broker上的filterServer列表。filterServer用于消息過(guò)濾。
-
路由注冊(cè)? RocketMQ路由注冊(cè)是通過(guò)broker與Namesrv的心跳功能實(shí)現(xiàn)的。broker啟動(dòng)時(shí)向集群中所有Namesrv發(fā)送心跳包,之后每隔30秒向集群中所有Namesrv發(fā)送心跳包。心跳包中包含:broker集群信息、broker信息、topic配置信息、broker關(guān)聯(lián)的FilterServer列表等。如果brokerA為Master。并且brokerA上的topic1的配置信息發(fā)生變化或初次注冊(cè),Namesrv會(huì)根據(jù)報(bào)文創(chuàng)建或更新Topic路由元數(shù)據(jù),填充topicQueueTable。 -
路由刪除? Namesrv收到brokerA的心跳包會(huì)更新brokerLiveTable中的brokerA對(duì)應(yīng)的BrokerLiveInfo中的lastUpdateTimestamp。Namesrv每隔10秒掃描brokerLiveTable一次。如果brokerA對(duì)應(yīng)的BrokerLiveInfo 中 lastUpdateTimestamp距當(dāng)前時(shí)間超過(guò) 120秒,Namesrv認(rèn)為brokerA失效,會(huì)將brokerA的路由信息移除并關(guān)閉與broker的socket連接。更新:topicQueueInfo、brokerAddrTable、brokerLiveTable、filterServerTable等。 -
路由發(fā)現(xiàn)? RocketMQ路由發(fā)現(xiàn)是非實(shí)時(shí)的。當(dāng)Topic路由信息發(fā)生變化是,Namesrv不會(huì)主動(dòng)推送給客戶端(Producer、Consumer)。而是由客戶端定時(shí)到Namesrv拉去最新的路由信息并緩存(包含Topic路由信息)。
與kafka對(duì)比
kafka 由zookeeper集群提供命名服務(wù)(Naming Service)。
Kafka通過(guò) ZooKeeper 管理集群配置、選舉 Leader 以及在 consumer g
Broker

與kafka對(duì)比:
kafka和RocketMQ的broker都可以容納多個(gè)一個(gè)或多個(gè)分區(qū)數(shù)據(jù)(kafka分區(qū):partition;RocketMQ分區(qū):queue)。
kafka基于partition(分區(qū)) 做備份/高可用(partition follower)。
RocketMQ增加了broker group的概念,基于broker(可能包含多個(gè)分區(qū))。
Producer、Consumer都只需要和集群中一個(gè)Namesrv建立長(zhǎng)連接。Broker需要向集群中所有的Namesrv發(fā)送心跳包。
其實(shí)很好理解:
Namesrv集群提供高可用的命名服務(wù)。
Producer、Consumer只需要從其中一臺(tái)定期同步路由信息。
如果Broker只隨機(jī)調(diào)一臺(tái)發(fā)送心跳包。那么不同的Namesrv保存的路由信息會(huì)出現(xiàn)
消費(fèi)者類型:
-
拉取式消費(fèi)(Pull Consumer) Consumer消費(fèi)的一種類型,應(yīng)用通常主動(dòng)調(diào)用Consumer的拉消息方法從Broker服務(wù)器拉消息、主動(dòng)權(quán)由應(yīng)用控制。一旦獲取了批量消息,應(yīng)用就會(huì)啟動(dòng)消費(fèi)過(guò)程。Pull方式里,取消息的過(guò)程需要用戶自己寫(包括提交offset等操作)。 -
推動(dòng)式消費(fèi)(Push Consumer) Consumer消費(fèi)的一種類型,該模式下Broker收到數(shù)據(jù)后會(huì)主動(dòng)推送給消費(fèi)端,該消費(fèi)模式一般實(shí)時(shí)性較高。Push Consumer原理上也是采取pull模式。實(shí)際上就是長(zhǎng)輪詢的pull模式。
一些概念
-
主題(Topic) 表示一類消息的集合,每個(gè)主題包含若干條消息,每條消息只能屬于一個(gè)主題,是RocketMQ進(jìn)行消息訂閱的基本單位。每個(gè)topic可分為若干個(gè)分區(qū)(queue)。 -
生產(chǎn)者組(Producer Group) 同一類Producer的集合,這類Producer發(fā)送同一類消息且發(fā)送邏輯一致。如果發(fā)送的是事務(wù)消息且原始生產(chǎn)者在發(fā)送之后崩潰,則Broker服務(wù)器會(huì)聯(lián)系同一生產(chǎn)者組的其他生產(chǎn)者實(shí)例以提交或回溯消費(fèi)。 -
消費(fèi)者組(Consumer Group) 同一類Consumer的集合,這類Consumer通常消費(fèi)同一類消息且消費(fèi)邏輯一致。消費(fèi)者組使得在消息消費(fèi)方面,實(shí)現(xiàn)負(fù)載均衡和容錯(cuò)的目標(biāo)變得非常容易。要注意的是,消費(fèi)者組的消費(fèi)者實(shí)例必須訂閱完全相同的Topic。RocketMQ 支持兩種消息模式:集群消費(fèi)(Clustering)和廣播消費(fèi)(Broadcasting)。 -
普通順序消息(Normal Ordered Message) 普通順序消費(fèi)模式下,消費(fèi)者通過(guò)同一個(gè)消費(fèi)隊(duì)列收到的消息是有順序的,不同消息隊(duì)列收到的消息則可能是無(wú)順序的。 -
嚴(yán)格順序消息(Strictly Ordered Message) 嚴(yán)格順序消息模式下,消費(fèi)者收到的所有消息均是有順序的。 -
消息(Message) 消息系統(tǒng)所傳輸信息的物理載體,生產(chǎn)和消費(fèi)數(shù)據(jù)的最小單位,每條消息必須屬于一個(gè)主題。RocketMQ中每個(gè)消息擁有唯一的Message ID,且可以攜帶具有業(yè)務(wù)標(biāo)識(shí)的Key。系統(tǒng)提供了通過(guò)Message ID和Key查詢消息的功能。 -
標(biāo)簽(Tag) 為消息設(shè)置的標(biāo)志,用于同一主題下區(qū)分不同類型的消息。來(lái)自同一業(yè)務(wù)單元的消息,可以根據(jù)不同業(yè)務(wù)目的在同一主題下設(shè)置不同標(biāo)簽。標(biāo)簽?zāi)軌蛴行У乇3执a的清晰度和連貫性,并優(yōu)化RocketMQ提供的查詢系統(tǒng)。消費(fèi)者可以根據(jù)Tag實(shí)現(xiàn)對(duì)不同子主題的不同消費(fèi)邏輯,實(shí)現(xiàn)更好的擴(kuò)展性。
關(guān)于消息中間件
1. 消息優(yōu)先級(jí)(Message Priority;RocketMQ不支持)
2. 順序消息(Message Order)
-
投遞消息的順序性:投遞消息的順序性可通過(guò)將一組消息投遞到同一分區(qū)實(shí)現(xiàn)。例如:借助MessageQueueSelector將對(duì)相同訂單的操作消息投放到同一分區(qū)。 -
消費(fèi)消息的順序性:RoctetMQ特性保障:特定分區(qū)(queue)中的消息不能同時(shí)被同一個(gè)消費(fèi)者組中的多個(gè)Consumer消費(fèi),以避免重復(fù)消費(fèi)。通過(guò)自定義或使用預(yù)置的AllocateQueueStrategy可設(shè)定分區(qū)的分配策略(哪些分區(qū)分配給哪個(gè)消費(fèi)者消費(fèi))。
3. 高可用、消息可靠性
3.1 消息持久化


3.2 broker master/salve
4. 高并發(fā)、可擴(kuò)展 ==> 分布式
4.1 生產(chǎn)并行度
4.2 消費(fèi)并行度
4.3 消息隊(duì)列分配策略
MessageQueueSelector

AllocateMessageQueueStrategy

AllocateMessageQueueAveragely:平均分配算法? AllocateMessageQueueAveragelyByCircle:基于環(huán)形平均分配算法 AllocateMachineRoomNearby:基于機(jī)房臨近原則算法 AllocateMessageQueueByMachineRoom:基于機(jī)房分配算法 AllocateMessageQueueConsistentHash:基于一致性hash算法 AllocateMessageQueueByConfig:基于配置分配算法
參考:
作者:RyanLee86799來(lái)源:https://juejin.im/post/6844904130822029320 文章轉(zhuǎn)載:JAVA高級(jí)架構(gòu)
(版權(quán)歸原作者所有,侵刪)