1. 程式人生 > >細談RocketMQ的消費模式

細談RocketMQ的消費模式

首先明確一點,RocketMQ 是基於釋出訂閱模型的訊息中介軟體。所謂的釋出訂閱就是說,consumer 訂閱了 broker 上的某個 topic,當 producer 釋出訊息到 broker 上的該 topic 時,consumer 就能收到該條訊息。

之前我們講過 consumer group 的概念,即消費同一類訊息的多個 consumer 例項組成一個消費者組,也可以稱為一個 consumer 叢集,這些 consumer 例項使用同一個 group name。需要注意一點,除了使用同一個 group name,訂閱的 tag 也必須是一樣的,只有符合這兩個條件的 consumer 例項才能組成 consumer 叢集。

叢集消費

當 consumer 使用叢集消費時,每條訊息只會被 consumer 叢集內的任意一個 consumer 例項消費一次。舉個例子,當一個 consumer 叢集內有 3 個consumer 例項(假設為consumer 1、consumer 2、consumer 3)時,一條訊息投遞過來,只會被consumer 1、consumer 2、consumer 3中的一個消費。

同時記住一點,使用叢集消費的時候,consumer 的消費進度是儲存在 broker 上,consumer 自身是不儲存消費進度的。訊息進度儲存在 broker 上的好處在於,當你 consumer 叢集是擴大或者縮小時,由於消費進度統一在broker上,訊息重複的概率會被大大降低了。

注意:在叢集消費模式下,並不能保證每一次訊息失敗重投都投遞到同一個 consumer 例項。

廣播消費

當 consumer 使用廣播消費時,每條訊息都會被 consumer 叢集內所有的 consumer 例項消費一次,也就是說每條訊息至少被每一個 consumer 例項消費一次。舉個例子,當一個 consumer 叢集內有 3 個 consumer 例項(假設為 consumer 1、consumer 2、consumer 3)時,一條訊息投遞過來,會被 consumer 1、consumer 2、consumer 3都消費一次。

與叢集消費不同的是,consumer 的消費進度是儲存在各個 consumer 例項上,這就容易造成訊息重複。還有很重要的一點,對於廣播消費來說,是不會進行消費失敗重投的,所以在 consumer 端消費邏輯處理時,需要額外關注消費失敗的情況。

雖然廣播消費能保證叢集內每個 consumer 例項都能消費訊息,但是消費進度的維護、不具備訊息重投的機制大大影響了實際的使用。因此,在實際使用中,更推薦使用叢集消費,因為叢集消費不僅擁有消費進度儲存的可靠性,還具有訊息重投的機制。而且,我們通過叢集消費也可以達到廣播消費的效果。

使用叢集消費模擬廣播消費

如果業務上確實需要使用廣播消費,那麼我們可以通過建立多個 consumer 例項,每個 consumer 例項屬於不同的 consumer group,但是它們都訂閱同一個 topic。舉個例子,我們建立 3 個 consumer 例項,consumer 1(屬於consumer group 1)、consumer 2(屬於 consumer group 2)、consumer 3(屬於consumer group 3),它們都訂閱了 topic A ,那麼當 producer 傳送一條訊息到 topic A 上時,由於 3 個consumer 屬於不同的 consumer group,所以 3 個consumer都能收到訊息,也就達到了廣播消費的效果了。 除此之外,每個 consumer 例項的消費邏輯可以一樣也可以不一樣,每個consumer group還可以根據需要增加 consumer 例項,比起廣播消費來說更加靈活。