RocketMQ的使用2
1、生產(chǎn)者組和消費(fèi)者組
1.1、生產(chǎn)者組
通常具有同樣屬性(處理的消息種類-topic、以及消息處理邏輯流程—分布式多個(gè)客戶端)的一些producer可以歸為同一個(gè)group。生產(chǎn)者組的作用是在集群的情況下,一個(gè)生產(chǎn)者down之后,本地事務(wù)回滾后,可以繼續(xù)聯(lián)系該組下的另外一個(gè)生產(chǎn)者實(shí)例,不至于導(dǎo)致業(yè)務(wù)走不下去。
在事務(wù)消息機(jī)制中,如果發(fā)送某條消息的producer-A宕機(jī),使得事務(wù)消息一直處于PREPARED狀態(tài)并超時(shí),則broker會(huì)回查同一個(gè)group的其他producer,確認(rèn)這條消息應(yīng)該commit 還是 rollback。
將發(fā)送不同主題的實(shí)例劃分為同一個(gè)生產(chǎn)者組通常也是可行的,但也不是太建議,從規(guī)范管理和監(jiān)控層面來(lái)講也不太方便。
1.2、消費(fèi)者組
消費(fèi)者組是一組消費(fèi)者的集合,這些消費(fèi)者共同訂閱一個(gè)或多個(gè)主題(Topic),并協(xié)同消費(fèi)這些主題中的消息。每個(gè)消費(fèi)者組都有一個(gè)唯一的標(biāo)識(shí)符(Group ID),消息隊(duì)列系統(tǒng)會(huì)根據(jù)這個(gè)標(biāo)識(shí)符來(lái)區(qū)分不同的消費(fèi)者組,并為每個(gè)消費(fèi)者組獨(dú)立維護(hù)消費(fèi)進(jìn)度。
特點(diǎn)說(shuō)明:
- 默認(rèn)情況下,在同一個(gè)消費(fèi)者組里,一條消息只會(huì)被組內(nèi)的一個(gè)消費(fèi)者實(shí)例消費(fèi)。消息隊(duì)列系統(tǒng)會(huì)通過(guò)負(fù)載均衡算法將消息分配給消費(fèi)者組內(nèi)的不同實(shí)例。在 RocketMQ 中,同個(gè)消息主題會(huì)被劃分為多個(gè)隊(duì)列,RocketMQ 的 Broker 會(huì)感知到消費(fèi)者組內(nèi)的所有消費(fèi)者實(shí)例,并根據(jù)負(fù)載均衡算法(如平均分配)將該主題下的消息隊(duì)列分配給各個(gè)消費(fèi)者實(shí)例,每個(gè)消息隊(duì)列在同一時(shí)間只會(huì)被一個(gè)消費(fèi)者實(shí)例消費(fèi),從而保證每條消息僅被一個(gè)實(shí)例處理。在一些特殊情況,比如消息模式是廣播模式時(shí),1個(gè)消息會(huì)被多個(gè)實(shí)例消費(fèi)。
- 不同消費(fèi)者組是互相獨(dú)立的,可以訂閱同個(gè)主題或不同主題。每個(gè)消費(fèi)者組可以獨(dú)立地消費(fèi)主題中的消息。當(dāng)生產(chǎn)者將消息發(fā)送到某個(gè)主題后,消息隊(duì)列會(huì)為每個(gè)訂閱了該主題的消費(fèi)者組維護(hù)一個(gè)獨(dú)立的消費(fèi)進(jìn)度,不同消費(fèi)者組對(duì)消息的消費(fèi)是相互隔離、互不影響的。
-
一條消息在不同消費(fèi)者組中通常會(huì)被重復(fù)消費(fèi)。消息隊(duì)列系統(tǒng)對(duì)每個(gè)消費(fèi)者組的消費(fèi)進(jìn)度是獨(dú)立維護(hù)的。當(dāng)生產(chǎn)者把消息發(fā)送到某個(gè)主題后,各個(gè)訂閱了該主題的消費(fèi)者組會(huì)各自記錄自己消費(fèi)到的位置。不同消費(fèi)者組對(duì)消息的消費(fèi)相互隔離,彼此不會(huì)影響。所以,每個(gè)消費(fèi)者組都可以獨(dú)立地從主題中獲取消息并進(jìn)行消費(fèi),同一條消息通常在不同消費(fèi)者組中會(huì)被重復(fù)處理。
在同個(gè)消費(fèi)者組內(nèi),不同的示例應(yīng)保持完全一樣的訂閱規(guī)則(包括主題、Tag),非常不建議在同個(gè)消費(fèi)者組內(nèi)不同實(shí)例訂閱不同規(guī)則。從技術(shù)實(shí)現(xiàn)角度來(lái)看,同個(gè)消費(fèi)者組內(nèi)的不同實(shí)例雖然能夠訂閱不同主題。但是,消費(fèi)者組的設(shè)計(jì)初衷就是讓組內(nèi)的實(shí)例共同協(xié)作來(lái)消費(fèi)同一個(gè)或多個(gè)主題的消息,以實(shí)現(xiàn)負(fù)載均衡、容錯(cuò)等功能。當(dāng)組內(nèi)實(shí)例訂閱不同主題時(shí),可能會(huì)存在以下問(wèn)題:
- 消費(fèi)進(jìn)度管理混亂:消息隊(duì)列系統(tǒng)通常會(huì)為每個(gè)消費(fèi)者組維護(hù)統(tǒng)一的消費(fèi)進(jìn)度,當(dāng)組內(nèi)實(shí)例訂閱不同主題時(shí),消費(fèi)進(jìn)度的管理會(huì)變得復(fù)雜,容易出現(xiàn)消費(fèi)進(jìn)度不一致的問(wèn)題,可能會(huì)漏掉一些消息。
- 負(fù)載均衡失效:消費(fèi)者組的負(fù)載均衡機(jī)制是基于組內(nèi)實(shí)例共同消費(fèi)相同主題設(shè)計(jì)的,訂閱不同主題會(huì)使該機(jī)制無(wú)法正常工作,可能導(dǎo)致部分實(shí)例負(fù)載過(guò)高,而部分實(shí)例閑置。
- 容錯(cuò)性降低:消費(fèi)者組的容錯(cuò)機(jī)制依賴于組內(nèi)實(shí)例對(duì)相同主題的共同消費(fèi),訂閱不同主題會(huì)削弱這種容錯(cuò)能力,當(dāng)某個(gè)實(shí)例出現(xiàn)故障時(shí),無(wú)法保證消息的正常消費(fèi)。
因此,在實(shí)際應(yīng)用中,盡量應(yīng)該讓同一個(gè)消費(fèi)者組內(nèi)的實(shí)例訂閱相同的主題,以充分發(fā)揮消費(fèi)者組的優(yōu)勢(shì),避免不必要的問(wèn)題
2、隊(duì)列
在創(chuàng)建主題時(shí),可以指定該主題包含的隊(duì)列數(shù)量。RocketMQ 會(huì)根據(jù)配置在相應(yīng)的 Broker 上創(chuàng)建指定數(shù)量的消息隊(duì)列。此外,在一些動(dòng)態(tài)擴(kuò)展的場(chǎng)景下,也可以根據(jù)實(shí)際需求動(dòng)態(tài)地增加隊(duì)列數(shù)量,以適應(yīng)業(yè)務(wù)流量的變化。
通常情況下,1個(gè)消息只會(huì)放在1個(gè)消息隊(duì)列中,而每個(gè)消息隊(duì)列在同一時(shí)間只會(huì)被一個(gè)消費(fèi)者實(shí)例消費(fèi),所以每條消息僅被一個(gè)實(shí)例處理。不過(guò)在一些特殊情況,比如廣播模式,當(dāng)消費(fèi)者組以廣播模式消費(fèi)消息時(shí),RocketMQ 會(huì)將每條消息發(fā)送到所有隊(duì)列,這樣每個(gè)隊(duì)列都會(huì)有相同的消息。在這種模式下,不管消息在哪個(gè)隊(duì)列中,每個(gè)消費(fèi)者實(shí)例都會(huì)收到主題下的所有消息。
一個(gè)隊(duì)列只能在同一時(shí)間只能分配給一個(gè)消費(fèi)者進(jìn)程,而一個(gè)消費(fèi)者進(jìn)程可以同時(shí)消費(fèi)多條隊(duì)列中的消息。

浙公網(wǎng)安備 33010602011771號(hào)