RocketMQ的消費模式
在公司的技術分享中,就有聊到rocketmq的消費模式,特此總結一下。
廣播消費
在說消費之前,這裡先說一下rocketmq中group的概念吧,一個group代表的是邏輯相同的一組例項,最可以表達這個概念的是我們將一個專案部署多個例項,那麼這個專案的叢集就可以稱之為一個group。
說完group,再來說說廣播消費,在這種模式下,rocketmq會將訊息傳送給group中的每一個消費者,如果這種模式在公司的專案中,會造成訊息重複消費的問題,理論上會有N-1次重複消費,那麼rocketmq為什麼還會保留這種消費模式呢?存在必有它的道理,比方說,如果需要動態更細一些配置,我們需要在不重啟服務的情況下,將新的配置推送給group中的每一個消費者,這時候廣播消費就發揮它的獨到之處了。
叢集消費
叢集消費是用的最廣泛的一種消費模式,在叢集消費模式下,同一條訊息,只能被group中的任意一個消費者消費,這個概念很重要,這是與廣播消費的最明顯區別。
在叢集消費模式下,我們的訊息只能被消費一次(實際上訊息也會重複消費,因為存在網路不穩定因素),rocketmq是怎麼實現的呢?
這裡我要說一下rocketmq中的佇列,在預設情況下,rocketmq會為每個topic在Broker節點上分配若干個佇列,查rocketmq手冊可知,預設的佇列數量是4 (defaultTopicQueueNums: 4),客戶端使用長輪詢發起請求,和服務端連線上,主動從broker上拉取訊息,而每個佇列只能由一個消費者監聽消費,這樣就做到了訊息的實時性得到保障,同時保證了訊息只有由一個消費者監聽消費,這時候問題又來了,消費者是隨機拉取訊息的嗎?
消費者它會隨機從broker上拉取訊息,且平均分攤消費訊息,比方說該topic下有8條訊息,其中一個group有2個消費者,那麼每個例項只消費其中的4條。
如果用佇列來舉例,也是成立的,比方說該topic下有4個佇列,只有兩個消費者,那麼第一個消費者消費3條佇列,第二個消費者消費2條佇列,rocketmq也因此實現了訂閱訊息的負載均衡特性。rocketmq可以橫向擴充套件消費者數量來提高叢集的消費能力,但由於一條佇列只能由一個消費者監聽消費,多餘的消費者將不能消費,所以我們擴充套件消費者數量的時候,需要注意佇列的數量是否大於消費者數量。
我發現rocketmq的原始碼有必要閱讀,我後面會有很多關於rocketmq的一些原始碼分析,敬請期待。
下面是我自己手畫的概念圖,很難看,將就著看吧: