全部產品
Search
文件中心

ApsaraMQ for RocketMQ:叢集消費和廣播消費

更新時間:Jul 01, 2024

叢集消費和廣播消費是雲訊息佇列 RocketMQ 版的基本消費模式,您可以在消費者用戶端將消費模式設定為叢集消費或者廣播消費,用於控制同一條訊息只能被叢集內一個消費者消費到,還是會被叢集內每個消費者都消費到。

背景資訊

雲訊息佇列 RocketMQ 版是基於發布和訂閱模式的訊息系統。消費者,即訊息的訂閱者,從訂閱的Topic中接收訊息並消費。

使用相同Group ID的多個消費者屬於同一個消費者叢集。同一個叢集下的消費者消費邏輯必須完全一致(包括Tag的使用)。更多資訊,請參見訂閱關係一致

叢集消費

基本概念

叢集消費模式下,同一Group下的多個消費者消費指定Topic中的訊息時,雲訊息佇列 RocketMQ 版會將多條訊息投遞給不同的消費者處理,同一條訊息只會被一個消費者消費到。

圖片2.png

適用情境

  • 訊息負載平衡:當業務訊息量很大時,可以使用叢集消費模式將訊息分配給多個消費者進行處理,實現負載平衡。每個消費者只處理其中一部分訊息,從而提高訊息的處理效率和輸送量。

  • 分布式資料處理:在大規模資料處理的情境中,使用叢集消費模式可以將資料分發給多個處理節點進行平行處理。每個節點只處理其中一部分資料,從而加速資料處理的速度。

注意事項

  • 叢集模式下,不保證每一次失敗重投的訊息投遞到同一台機器上。

  • 請保持消費模式一致性,即一個Group下的所有消費者都設定相同的消費模式,如果消費模式混用則全部以廣播消費為準。

    例如,同一個Group下有5個Consumer,其中2個Consumer設定為叢集模式消費,另外3個Consumer設定為廣播消費模式,實際所有的Consumer都將按照廣播消費模式進行消費。

廣播消費

基本概念

廣播消費模式下,同一Group下的多個消費者消費指定Topic中的訊息時,雲訊息佇列 RocketMQ 版會將每條訊息都投遞給叢集內所有的消費者,保證每條訊息至少被每個消費者消費一次。

該模式適用於多個消費者對同一組訊息進行平行處理的情況,例如,訂單處理。

圖片3.png

適用情境

  • 通知公告:當某個重要公告或通知發布時,系統可以使用廣播消費模式,將通知發送給所有訂閱了該訊息的使用者。這樣可以確保每個使用者都能及時收到通知,並避免遺漏。

  • 即時資料同步:在分布式系統中,有時需要將某個資料進行即時同步,保持多個節點的資料一致性。可以使用廣播消費模式將這個資料的變更通知發送給所有需要同步的節點,每個節點都會收到相同的變更訊息,從而保持資料的即時同步。

注意事項

  • 廣播模式下,雲訊息佇列 RocketMQ 版保證訊息至少被用戶端消費一次,但是並不會重投消費失敗的訊息,因此業務方需要關注消費失敗的情況。

  • 廣播模式下,用戶端每一次重啟都會從最新訊息消費。用戶端在被停止期間發送至服務端的訊息將會被自動跳過,請謹慎選擇。

  • 廣播模式下,每條訊息都會被大量的用戶端重複處理,因此推薦儘可能使用叢集模式。

  • 請保持消費模式一致性,即一個Group下的所有消費者都設定相同的消費模式,如果消費模式混用則全部以廣播消費為準。

    例如,同一個Group下有5個Consumer,其中2個Consumer設定為叢集模式消費,另外3個Consumer設定為廣播消費模式,實際所有的Consumer都將按照廣播消費模式進行消費。

叢集消費和廣播消費功能差異

叢集消費和廣播消費模式下,各功能的支援情況如下:

功能

叢集消費

廣播消費

TCP協議SDK

對號

對號

HTTP協議SDK

對號

錯號

順序訊息

對號

錯號

重設消費位點

對號

錯號

訊息重試

對號

錯號

訊息堆積查詢、警示

對號

錯號

訂閱關係查詢

對號

錯號

消費進度

由服務端維護

  • 可靠性更高,用戶端重啟後,將按照上次的消費進度繼續消費。

  • 支援服務端消費重試機制,詳細資料,請參見訊息重試

由用戶端維護

出現重複消費的機率稍大於叢集模式,用戶端每次重啟都會從最新訊息消費。

設定叢集消費和廣播消費

雲訊息佇列 RocketMQ 版的消費方式支援在消費者用戶端修改,您需要在訂閱訊息的SDK代碼中設定相關參數。若未設定,則預設使用叢集消費方式。

TCP協議SDK

Java SDK樣本

  • 叢集消費

    // MessageModel設定為CLUSTERING(不設定的情況下,預設為叢集消費)。
    properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);
  • 廣播消費

    // MessageModel設定為BROADCASTING。
    properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING); 

C/C++ SDK樣本

  • 叢集消費

    // MessageModel設定為CLUSTERING(不設定的情況下,預設為叢集消費)。
    factoryInfo.setFactoryProperty(ONSFactoryProperty:: MessageModel, ONSFactoryProperty::CLUSTERING);
  • 廣播消費

    // MessageModel設定為BROADCASTING。
    factoryInfo.setFactoryProperty(ONSFactoryProperty:: MessageModel, ONSFactoryProperty::BROADCASTING);

.NET SDK樣本

  • 叢集消費

    // MessageModel設定為CLUSTERING(不設定的情況下,預設為叢集消費)。
    factoryInfo.setFactoryProperty(ONSFactoryProperty.MessageModel, ONSFactoryProperty.CLUSTERING); 
  • 廣播消費

    // MessageModel設定為BROADCASTING。
    factoryInfo.setFactoryProperty(ONSFactoryProperty.MessageModel, ONSFactoryProperty.BROADCASTING);     

HTTP協議SDK

HTTP協議預設僅支援叢集消費,無需設定。

叢集消費和廣播消費常見問題

為什麼將消費模式設定為廣播消費實際未生效?

可能原因如下:

  • 您使用的順序訊息:順序訊息僅支援叢集消費,不支援廣播消費。

  • 您使用的HTTP協議的SDK:HTTP協議僅支援叢集消費,不支援廣播消費。

一個Group中,是否支援既設定叢集消費又設定廣播消費?

不支援。

請保持消費模式一致性,即一個Group下的所有消費者都設定相同的消費模式,如果消費模式混用則全部以廣播消費為準。

相關文檔

完整的訊息收發範例程式碼,請參見SDK參考概述