集群消費(fèi)和廣播消費(fèi)
集群消費(fèi)和廣播消費(fèi)是云消息隊(duì)列 RocketMQ 版的基本消費(fèi)模式,您可以在消費(fèi)者客戶(hù)端將消費(fèi)模式設(shè)置為集群消費(fèi)或者廣播消費(fèi),用于控制同一條消息只能被集群內(nèi)一個(gè)消費(fèi)者消費(fèi)到,還是會(huì)被集群內(nèi)每個(gè)消費(fèi)者都消費(fèi)到。
背景信息
云消息隊(duì)列 RocketMQ 版是基于發(fā)布和訂閱模式的消息系統(tǒng)。消費(fèi)者,即消息的訂閱方,從訂閱的Topic中接收消息并消費(fèi)。
使用相同Group ID的多個(gè)消費(fèi)者屬于同一個(gè)消費(fèi)者集群。同一個(gè)集群下的消費(fèi)者消費(fèi)邏輯必須完全一致(包括Tag的使用)。更多信息,請(qǐng)參見(jiàn)訂閱關(guān)系一致。
集群消費(fèi)
基本概念
集群消費(fèi)模式下,同一Group下的多個(gè)消費(fèi)者消費(fèi)指定Topic中的消息時(shí),云消息隊(duì)列 RocketMQ 版會(huì)將多條消息投遞給不同的消費(fèi)者處理,同一條消息只會(huì)被一個(gè)消費(fèi)者消費(fèi)到。
適用場(chǎng)景
消息負(fù)載均衡:當(dāng)業(yè)務(wù)消息量很大時(shí),可以使用集群消費(fèi)模式將消息分配給多個(gè)消費(fèi)者進(jìn)行處理,實(shí)現(xiàn)負(fù)載均衡。每個(gè)消費(fèi)者只處理其中一部分消息,從而提高消息的處理效率和吞吐量。
分布式數(shù)據(jù)處理:在大規(guī)模數(shù)據(jù)處理的場(chǎng)景中,使用集群消費(fèi)模式可以將數(shù)據(jù)分發(fā)給多個(gè)處理節(jié)點(diǎn)進(jìn)行并行處理。每個(gè)節(jié)點(diǎn)只處理其中一部分?jǐn)?shù)據(jù),從而加速數(shù)據(jù)處理的速度。
注意事項(xiàng)
集群模式下,不保證每一次失敗重投的消息投遞到同一臺(tái)機(jī)器上。
請(qǐng)保持消費(fèi)模式一致性,即一個(gè)Group下的所有消費(fèi)者都設(shè)置相同的消費(fèi)模式,如果消費(fèi)模式混用則全部以廣播消費(fèi)為準(zhǔn)。
例如,同一個(gè)Group下有5個(gè)Consumer,其中2個(gè)Consumer設(shè)置為集群模式消費(fèi),另外3個(gè)Consumer設(shè)置為廣播消費(fèi)模式,實(shí)際所有的Consumer都將按照廣播消費(fèi)模式進(jìn)行消費(fèi)。
廣播消費(fèi)
基本概念
廣播消費(fèi)模式下,同一Group下的多個(gè)消費(fèi)者消費(fèi)指定Topic中的消息時(shí),云消息隊(duì)列 RocketMQ 版會(huì)將每條消息都投遞給集群內(nèi)所有的消費(fèi)者,保證每條消息至少被每個(gè)消費(fèi)者消費(fèi)一次。
該模式適用于多個(gè)消費(fèi)者對(duì)同一組消息進(jìn)行并行處理的情況,例如,訂單處理。
適用場(chǎng)景
通知公告:當(dāng)某個(gè)重要公告或通知發(fā)布時(shí),系統(tǒng)可以使用廣播消費(fèi)模式,將通知發(fā)送給所有訂閱了該消息的用戶(hù)。這樣可以確保每個(gè)用戶(hù)都能及時(shí)收到通知,并避免遺漏。
實(shí)時(shí)數(shù)據(jù)同步:在分布式系統(tǒng)中,有時(shí)需要將某個(gè)數(shù)據(jù)進(jìn)行實(shí)時(shí)同步,保持多個(gè)節(jié)點(diǎn)的數(shù)據(jù)一致性。可以使用廣播消費(fèi)模式將這個(gè)數(shù)據(jù)的變更通知發(fā)送給所有需要同步的節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都會(huì)收到相同的變更消息,從而保持?jǐn)?shù)據(jù)的實(shí)時(shí)同步。
注意事項(xiàng)
廣播模式下,云消息隊(duì)列 RocketMQ 版保證消息至少被客戶(hù)端消費(fèi)一次,但是并不會(huì)重投消費(fèi)失敗的消息,因此業(yè)務(wù)方需要關(guān)注消費(fèi)失敗的情況。
廣播模式下,客戶(hù)端每一次重啟都會(huì)從最新消息消費(fèi)。客戶(hù)端在被停止期間發(fā)送至服務(wù)端的消息將會(huì)被自動(dòng)跳過(guò),請(qǐng)謹(jǐn)慎選擇。
廣播模式下,每條消息都會(huì)被大量的客戶(hù)端重復(fù)處理,因此推薦盡可能使用集群模式。
請(qǐng)保持消費(fèi)模式一致性,即一個(gè)Group下的所有消費(fèi)者都設(shè)置相同的消費(fèi)模式,如果消費(fèi)模式混用則全部以廣播消費(fèi)為準(zhǔn)。
例如,同一個(gè)Group下有5個(gè)Consumer,其中2個(gè)Consumer設(shè)置為集群模式消費(fèi),另外3個(gè)Consumer設(shè)置為廣播消費(fèi)模式,實(shí)際所有的Consumer都將按照廣播消費(fèi)模式進(jìn)行消費(fèi)。
集群消費(fèi)和廣播消費(fèi)功能差異
集群消費(fèi)和廣播消費(fèi)模式下,各功能的支持情況如下:
功能 | 集群消費(fèi) | 廣播消費(fèi) |
TCP協(xié)議SDK | ||
HTTP協(xié)議SDK | ||
順序消息 | ||
重置消費(fèi)位點(diǎn) | ||
消息重試 | ||
消息堆積查詢(xún)、報(bào)警 | ||
訂閱關(guān)系查詢(xún) | ||
消費(fèi)進(jìn)度 | 由服務(wù)端維護(hù)
| 由客戶(hù)端維護(hù) 出現(xiàn)重復(fù)消費(fèi)的概率稍大于集群模式,客戶(hù)端每次重啟都會(huì)從最新消息消費(fèi)。 |
設(shè)置集群消費(fèi)和廣播消費(fèi)
云消息隊(duì)列 RocketMQ 版的消費(fèi)方式支持在消費(fèi)者客戶(hù)端修改,您需要在訂閱消息的SDK代碼中設(shè)置相關(guān)參數(shù)。若未設(shè)置,則默認(rèn)使用集群消費(fèi)方式。
TCP協(xié)議SDK
Java SDK示例
集群消費(fèi)
// MessageModel設(shè)置為CLUSTERING(不設(shè)置的情況下,默認(rèn)為集群消費(fèi))。 properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);
廣播消費(fèi)
// MessageModel設(shè)置為BROADCASTING。 properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING);
C/C++ SDK示例
集群消費(fèi)
// MessageModel設(shè)置為CLUSTERING(不設(shè)置的情況下,默認(rèn)為集群消費(fèi))。 factoryInfo.setFactoryProperty(ONSFactoryProperty:: MessageModel, ONSFactoryProperty::CLUSTERING);
廣播消費(fèi)
// MessageModel設(shè)置為BROADCASTING。 factoryInfo.setFactoryProperty(ONSFactoryProperty:: MessageModel, ONSFactoryProperty::BROADCASTING);
.NET SDK示例
集群消費(fèi)
// MessageModel設(shè)置為CLUSTERING(不設(shè)置的情況下,默認(rèn)為集群消費(fèi))。 factoryInfo.setFactoryProperty(ONSFactoryProperty.MessageModel, ONSFactoryProperty.CLUSTERING);
廣播消費(fèi)
// MessageModel設(shè)置為BROADCASTING。 factoryInfo.setFactoryProperty(ONSFactoryProperty.MessageModel, ONSFactoryProperty.BROADCASTING);
HTTP協(xié)議SDK
HTTP協(xié)議默認(rèn)僅支持集群消費(fèi),無(wú)需設(shè)置。
集群消費(fèi)和廣播消費(fèi)常見(jiàn)問(wèn)題
為什么將消費(fèi)模式設(shè)置為廣播消費(fèi)實(shí)際未生效?
可能原因如下:
您使用的順序消息:順序消息僅支持集群消費(fèi),不支持廣播消費(fèi)。
您使用的HTTP協(xié)議的SDK:HTTP協(xié)議僅支持集群消費(fèi),不支持廣播消費(fèi)。
一個(gè)Group中,是否支持既設(shè)置集群消費(fèi)又設(shè)置廣播消費(fèi)?
不支持。
請(qǐng)保持消費(fèi)模式一致性,即一個(gè)Group下的所有消費(fèi)者都設(shè)置相同的消費(fèi)模式,如果消費(fèi)模式混用則全部以廣播消費(fèi)為準(zhǔn)。
相關(guān)文檔
完整的消息收發(fā)示例代碼,請(qǐng)參見(jiàn)SDK參考概述。