當前位置:編程學習大全網 - 遊戲軟體 - mq中如何保證消費者順序消費

mq中如何保證消費者順序消費

通常mq可以保證先到隊列的消息按照順序分發給消費者消費來保證順序,但是壹個隊列有多個消費者消費的時候,那將失去這個保證,因為這些消息被多個線程並發的消費。但是有的時候消息按照順序處理是很重要的,那我們該如何來保證消息的順序呢,下面將從activemq和rocketmq來看看,它們是如何來保證消息的順序問題的?我們還可以有別的處理方案麽?

1、利用Activemq的高級特性:consumer之獨有消費者(exclusive consumer)

在ActiveMQ4.x中可以采用Exclusive Consumer,broker會從queue中,壹次發送消息給壹個消費者,這樣就避免了多個消費者並發消費的問題,從而保證順序,配置如下:

.當在接收信息的時候有壹個或者多個備份接收消息者和壹個獨占消息者的同時接收時候,無論兩者創建先後,在接收的時候,均為獨占消息者接收。

.當在接收信息的時候,有多個獨占消費者的時候,只有壹個獨占消費者可以接收到消息。

.當有多個備份消息者和多個獨占消費者的時候,當所有的獨占消費者均close的時候,只有壹個備份消費者接到到消息。

.當主消費者掛了話,會立刻啟用故障切換轉移到下壹臺消費者繼續消費

獨占消息就是在有多個消費者同時消費壹個queue時,可以保證只有壹個消費者可以消費消息,這樣雖然保證了消息的順序問題,不過也帶來了壹個問題,就是這個queue的所有消息將只會在這壹個主消費者上消費,其他消費者將閑置,達不到負載均衡分配,而實際業務我們可能更多的是這樣的場景,比如壹個訂單會發出壹組順序消息,我們只要求這壹組消息是順序消費的,而訂單與訂單之間又是可以並行消費的,不需要順序,因為順序也沒有任何意義,有沒有辦法做到呢?答案是可以的,下面就來看看activemq的另壹個高級特性之messageGroup。

2、利用Activemq的高級特性:messageGroups

Message Groups特性是壹種負載均衡的機制。在壹個消息被分發到consumer之前,broker首先檢查消息JMSXGroupID屬性。如果存在,那麽broker會檢查是否有某個consumer擁有這個message group。如果沒有,那麽broker會選擇壹個consumer,並將它關聯到這個message group。此後,這個consumer會接收這個message group的所有消息,直到:

Consumer被關閉

Message group被關閉,通過發送壹個消息,並設置這個消息的JMSXGroupSeq為-1

如上圖所示,同壹個queue中,擁有相同JMSXGroupID的消息將發往同壹個消費者,解決順序問題,不同分組的消息又能被其他消費者並行消費,解決負載均衡的問題,兩全其美啦!

Rocketmq處理方案

那rocketmq又是如何保證消息順序消費的問題呢?

Rocketmq跟傳統的MQ有壹點區別,這裏有必要講壹下topic的概念,Topic是RocketMQ中的壹個重要概念,RocketMQ的各組件都是圍繞著Topic建立起對應關系的,在RocketMQ官方文檔和本文中, Topic在不同的語境下被賦予了兩種不同的語義:

1)消息的Topic屬性值:在描述Consumer的訂閱設置信息或消息的屬性時。

2)Topic屬性為某個值的消息(單個消息或消息集合):在描述Broker,Producer和Consumer的對應關系,Queue以及負載均衡策略時。

topic和queue的對應關系是壹個topic擁有多個queue,當producer往broken發送消息時,消息會存儲在topic下的不同隊列中,而壹個隊列只會被壹個consumer消費,這樣消息戶被均衡負載到不同的隊列下,也就是會被多個消費者並行消費,順序就無法保證了。該怎麽辦呢?答案是把需要順序消費的消息發送到同壹臺broker server下的同壹個隊列,而這些消息也只會被同壹個消費者消費,這樣就可以保證嚴格的順序了,如下圖:

1、消息要有順序,首先得保證producer發送消息有順序,如上圖msg1,msg2,msg3發送到queue0是要有順序的,只要producer等待前面的消息發送成功,在發送後面的消息就完全可以保證了,

2、假設msg1發送給consumer1,消費沒有響應,該怎麽辦呢?是繼續發送msg2還是重新發送msg1,壹般為了保證消息壹定被消費,肯定會選擇重發msg1到下壹臺消費者consumer2。

3、消費端1沒有響應Server時有兩種情況,壹種是msg1確實沒有到達(數據在網絡傳送中丟失),另外壹種消費端已經消費msg2且已經發送響應消息,只是MQ Server端沒有收到。如果是第二種情況,重發msg1,就會造成msg1被重復消費。也就引入了消息重復問題,那就要冪等了。

Rocketmq同樣做到了保證消息的順序情況下,均衡消費的消費消息。

綜上,我看到,在分布式系統中,要想消息有順序的被消費,無論是Activemq還是Rocketmq都要想辦法讓有順序的消息被同壹消費者消費,而不是並發的消費,在消費者消費成功後,接著才會消費下壹個消息,這樣就可以保證了嚴格的順序。

  • 上一篇:dnf85級劍神純刷加點?拿什麽武器?本人用不慣流心技能。要詳細點,最好有解釋!!!求大神!!!
  • 下一篇:科比·比恩·布萊恩特是科比的全名嗎?
  • copyright 2024編程學習大全網