RocketMQ-架構(gòu)設(shè)計(jì)
1 技術(shù)架構(gòu)
RocketMQ架構(gòu)上主要分為四部分彼水,如上圖所示:
Producer:消息發(fā)布的角色谷婆,支持分布式集群方式部署墓造。Producer通過MQ的負(fù)載均衡模塊選擇相應(yīng)的Broker集群隊(duì)列進(jìn)行消息投遞媒区,投遞的過程支持快速失敗并且低延遲。
Consumer:消息消費(fèi)的角色已脓,支持分布式集群方式部署声邦。支持以push推,pull拉兩種模式對消息進(jìn)行消費(fèi)摆舟。同時(shí)也支持集群方式和廣播方式的消費(fèi)亥曹,它提供實(shí)時(shí)消息訂閱機(jī)制,可以滿足大多數(shù)用戶的需求恨诱。
NameServer:NameServer是一個(gè)非常簡單的Topic路由注冊中心媳瞪,其角色類似Dubbo中的zookeeper,支持Broker的動態(tài)注冊與發(fā)現(xiàn)照宝。主要包括兩個(gè)功能:Broker管理蛇受,NameServer接受Broker集群的注冊信息并且保存下來作為路由信息的基本數(shù)據(jù)。然后提供心跳檢測機(jī)制厕鹃,檢查Broker是否還存活兢仰;路由信息管理,每個(gè)NameServer將保存關(guān)于Broker集群的整個(gè)路由信息和用于客戶端查詢的隊(duì)列信息剂碴。然后Producer和Conumser通過NameServer就可以知道整個(gè)Broker集群的路由信息把将,從而進(jìn)行消息的投遞和消費(fèi)。NameServer通常也是集群的方式部署忆矛,各實(shí)例間相互不進(jìn)行信息通訊察蹲。Broker是向每一臺NameServer注冊自己的路由信息,所以每一個(gè)NameServer實(shí)例上面都保存一份完整的路由信息洽议。當(dāng)某個(gè)NameServer因某種原因下線了,Broker仍然可以向其它NameServer同步其路由信息亚兄,Producer,Consumer仍然可以動態(tài)感知Broker的路由的信息。
-
BrokerServer:Broker主要負(fù)責(zé)消息的存儲审胚、投遞和查詢以及服務(wù)高可用保證匈勋,為了實(shí)現(xiàn)這些功能,Broker包含了以下幾個(gè)重要子模塊菲盾。
- Remoting Module:整個(gè)Broker的實(shí)體颓影,負(fù)責(zé)處理來自clients端的請求懒鉴。
- Client Manager:負(fù)責(zé)管理客戶端(Producer/Consumer)和維護(hù)Consumer的Topic訂閱信息
- Store Service:提供方便簡單的API接口處理消息存儲到物理硬盤和查詢功能碎浇。
- HA Service:高可用服務(wù)临谱,提供Master Broker 和 Slave Broker之間的數(shù)據(jù)同步功能。
- Index Service:根據(jù)特定的Message key對投遞到Broker的消息進(jìn)行索引服務(wù)奴璃,以提供消息的快速查詢悉默。
2 部署架構(gòu)
RocketMQ 網(wǎng)絡(luò)部署特點(diǎn)
NameServer是一個(gè)幾乎無狀態(tài)節(jié)點(diǎn)苟穆,可集群部署,節(jié)點(diǎn)之間無任何信息同步雳旅。
Broker部署相對復(fù)雜,Broker分為Master與Slave攒盈,一個(gè)Master可以對應(yīng)多個(gè)Slave,但是一個(gè)Slave只能對應(yīng)一個(gè)Master型豁,Master與Slave 的對應(yīng)關(guān)系通過指定相同的BrokerName,不同的BrokerId 來定義迎变,BrokerId為0表示Master,非0表示Slave衣形。Master也可以部署多個(gè)。每個(gè)Broker與NameServer集群中的所有節(jié)點(diǎn)建立長連接泵喘,定時(shí)注冊Topic信息到所有NameServer。 注意:當(dāng)前RocketMQ版本在部署架構(gòu)上支持一Master多Slave纪铺,但只有BrokerId=1的從服務(wù)器才會參與消息的讀負(fù)載。
Producer與NameServer集群中的其中一個(gè)節(jié)點(diǎn)(隨機(jī)選擇)建立長連接突诬,定期從NameServer獲取Topic路由信息苫拍,并向提供Topic 服務(wù)的Master建立長連接旺隙,且定時(shí)向Master發(fā)送心跳。Producer完全無狀態(tài)蔬捷,可集群部署。
Consumer與NameServer集群中的其中一個(gè)節(jié)點(diǎn)(隨機(jī)選擇)建立長連接周拐,定期從NameServer獲取Topic路由信息,并向提供Topic服務(wù)的Master妥粟、Slave建立長連接,且定時(shí)向Master滩报、Slave發(fā)送心跳。Consumer既可以從Master訂閱消息脓钾,也可以從Slave訂閱消息,消費(fèi)者在向Master拉取消息時(shí)惭笑,Master服務(wù)器會根據(jù)拉取偏移量與最大偏移量的距離(判斷是否讀老消息生真,產(chǎn)生讀I/O)沉噩,以及從服務(wù)器是否可讀等因素建議下一次是從Master還是Slave拉取柱蟀。
結(jié)合部署架構(gòu)圖川蒙,描述集群工作流程:
- 啟動NameServer长已,NameServer起來后監(jiān)聽端口,等待Broker术瓮、Producer、Consumer連上來胞四,相當(dāng)于一個(gè)路由控制中心。
- Broker啟動辜伟,跟所有的NameServer保持長連接脊另,定時(shí)發(fā)送心跳包。心跳包中包含當(dāng)前Broker信息(IP+端口等)以及存儲所有Topic信息约巷。注冊成功后偎痛,NameServer集群中就有Topic跟Broker的映射關(guān)系。
- 收發(fā)消息前独郎,先創(chuàng)建Topic,創(chuàng)建Topic時(shí)需要指定該Topic要存儲在哪些Broker上囚聚,也可以在發(fā)送消息時(shí)自動創(chuàng)建Topic标锄。
- Producer發(fā)送消息,啟動時(shí)先跟NameServer集群中的其中一臺建立長連接料皇,并從NameServer中獲取當(dāng)前發(fā)送的Topic存在哪些Broker上,輪詢從隊(duì)列列表中選擇一個(gè)隊(duì)列鬼譬,然后與隊(duì)列所在的Broker建立長連接從而向Broker發(fā)消息逊脯。
- Consumer跟Producer類似优质,跟其中一臺NameServer建立長連接军洼,獲取當(dāng)前訂閱Topic存在哪些Broker上,然后直接跟Broker建立連接通道匕争,開始消費(fèi)消息。
參考官網(wǎng):https://github.com/apache/rocketmq/blob/master/docs/cn/architecture.md