RocketMQ-初体验RocketMQ(05)_RocketMQ架构解读
文章目錄
- Rocketmq整體架構(gòu)
- namesrv
- broker
- producer & consumer
- 通信方式
Rocketmq整體架構(gòu)
RocketMQ-初體驗(yàn)RocketMQ(01)_RocketMQ初體驗(yàn)中 對(duì) RocketMQ 架構(gòu)圖做了一個(gè)大體的介紹
接下來(lái),我們?cè)偌?xì)說(shuō)一下RocketMQ的架構(gòu)
如上圖
整體由4部分組成
- namesrv
- broker
- producer
- consumer
namesrv
當(dāng)broker服務(wù)啟動(dòng)后,會(huì)向namesrv注冊(cè)信息,比如broker中的 主題、消費(fèi)偏移量、隊(duì)列、ip、端口等,由broker的心跳發(fā)送到namesrv。
broker cluster中的每一個(gè)節(jié)點(diǎn)都會(huì)注冊(cè)到namesrv上。
比如 你有4個(gè)broker節(jié)點(diǎn),2個(gè)namesrv,那么注冊(cè)如下
這種情況的話,即使一個(gè)namesrv節(jié)點(diǎn)掛了,剩下的一個(gè)namesrv節(jié)點(diǎn)仍然包含所有的broker信息。
需要注意的是: namesrv是無(wú)狀態(tài)的, namesrv之間不會(huì)相互通信,跟zk是不一樣的。一個(gè)namesrv掛了,不會(huì)影響另外一個(gè)namesrv,這倆namesrv是沒(méi)有關(guān)聯(lián)的。
broker
來(lái)南下每個(gè)broker的組成吧
每一個(gè)broker節(jié)點(diǎn) ,儲(chǔ)存消息,都會(huì)對(duì)應(yīng)一個(gè)commitlog , commitlog 負(fù)責(zé)存儲(chǔ)真實(shí)的消息的內(nèi)容。
broker中的每個(gè)topic , 如果不設(shè)置的話, 默認(rèn)創(chuàng)建4個(gè)隊(duì)列, 隊(duì)列編號(hào) 0 , 1 ,2 , 3. 每個(gè)隊(duì)列都會(huì)對(duì)應(yīng)一個(gè)持久化文件 。
當(dāng)producer向broker中的topic發(fā)送消息的時(shí)候, 如果發(fā)現(xiàn)隊(duì)列沒(méi)有創(chuàng)建持久化文件,會(huì)自動(dòng)創(chuàng)建。 然后該隊(duì)列的持久化信息都會(huì)存放在該持久化文件中。
每個(gè)broker下面會(huì)創(chuàng)建一個(gè)consumerOffset.json文件. 這個(gè)json文件用來(lái)記錄當(dāng)前你消費(fèi)節(jié)點(diǎn)已經(jīng)消費(fèi)的數(shù)據(jù)位置,即消費(fèi)的偏移量。這個(gè)也是需要持久化的。 這個(gè)偏移量的來(lái)源 是 consumer 來(lái)上報(bào)的。(如下圖)
consumer從broker中拉取消息后,要進(jìn)行消費(fèi),消費(fèi)了多多少消息,要把消費(fèi)這些對(duì)應(yīng)的這些偏移量上報(bào)到broker上去。 主要是為了什么呢? ---->最大可能的避免消息重復(fù)的推送。
producer & consumer
Q: producer & consumer 到底選擇跟哪個(gè)broker去連接,去消費(fèi)哪個(gè)broker中的消息?
A: producer & consumer也是無(wú)狀態(tài)的,每一個(gè)producer之間 ,每一個(gè)consumer之間都不會(huì)通信, 每個(gè)producer和consumer內(nèi)部都有自己的一套負(fù)載均衡的算法 ,默認(rèn)的選擇策略: 已發(fā)送的消息數(shù)量對(duì)queuecount取mod .
消費(fèi)者的兩種消費(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ò)程。
-
推動(dòng)式消費(fèi)(Push Consumer):Consumer消費(fèi)的一種類型,該模式下Broker收到數(shù)據(jù)后會(huì)主動(dòng)推送給消費(fèi)端,該消費(fèi)模式一般實(shí)時(shí)性較高。
pull的方式,由客戶端來(lái)主動(dòng)獲取,通過(guò)定時(shí)任務(wù)或者需要的時(shí)候從broker端獲取,這種方式用的比較少。 如果消息量比較少, 堆積也不會(huì)太多,對(duì)安全性要求不高的應(yīng)用,可以考慮。
與此對(duì)應(yīng)的另外一種push方式:
push的方式,在RocketMQ中其實(shí)也是基于pull模式的一個(gè)深度封裝,consumer對(duì)broker進(jìn)行一個(gè)長(zhǎng)輪詢,一直監(jiān)聽(tīng)broker中的數(shù)據(jù),就好像是broker主動(dòng)推送給consumer似的。
通信方式
producer/consumer broker namesrv 通信方式
producer/consumer 給 broker發(fā)送消息/消費(fèi)消息,或者從 namesrv拉取消息 , 通信是基于netty的方式,優(yōu)先選用epoll方式,如果操作系統(tǒng)不支持epoll的話,會(huì)選擇NIO。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的RocketMQ-初体验RocketMQ(05)_RocketMQ架构解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RocketMQ-初体验RocketMQ
- 下一篇: RocketMQ-初体验RocketMQ