Spring Cloud Stream如何處理消息重復(fù)消費绳锅?

最近收到好幾個類似的問題:使用Spring Cloud Stream操作RabbitMQ或Kafka的時候飒焦,出現(xiàn)消息重復(fù)消費的問題。通過溝通與排查下來主要還是用戶對消費組的認識不夠悼沿。其實等舔,在之前的博文以及《Spring Cloud微服務(wù)實戰(zhàn)》一書中都有提到關(guān)于消費組的概念以及作用。

那么什么是消費組呢糟趾?為什么要用消費組慌植?它解決什么問題呢?摘錄一段之前博文的內(nèi)容义郑,來解答這些疑問:

通常在生產(chǎn)環(huán)境蝶柿,我們的每個服務(wù)都不會以單節(jié)點的方式運行在生產(chǎn)環(huán)境,當同一個服務(wù)啟動多個實例的時候非驮,這些實例都會綁定到同一個消息通道的目標主題(Topic)上交汤。默認情況下,當生產(chǎn)者發(fā)出一條消息到綁定通道上劫笙,這條消息會產(chǎn)生多個副本被每個消費者實例接收和處理(出現(xiàn)上述重復(fù)消費問題)芙扎。但是有些業(yè)務(wù)場景之下,我們希望生產(chǎn)者產(chǎn)生的消息只被其中一個實例消費填大,這個時候我們需要為這些消費者設(shè)置消費組來實現(xiàn)這樣的功能戒洼。

下面,通過一個例子來看看如何使用消費組:

問題重現(xiàn)

構(gòu)建消息消費端

第一步:創(chuàng)建綁定接口允华,綁定example-topic輸入通道(默認情況下圈浇,會綁定到RabbitMQ的同名Exchange或Kafaka的同名Topic)。

interfaceExampleBinder{

? ? String NAME = "example-topic";

? ? @Input(NAME)

? ? SubscribableChannelinput();

}

第二步:對上述輸入通道創(chuàng)建監(jiān)聽與處理邏輯靴寂。

@EnableBinding(ExampleBinder.class)public classExampleReceiver{

? ? private static Logger logger = LoggerFactory.getLogger(ExampleReceiver.class);

? ? @StreamListener(ExampleBinder.NAME)

? ? publicvoidreceive(String payload){

? ? ? ? logger.info("Received: " + payload);

? ? }

}

第三步汉额;創(chuàng)建應(yīng)用主類和配置文件

@SpringBootApplicationpublic classExampleApplication{

? ? publicstaticvoidmain(String[] args){

? ? ? ? SpringApplication.run(ExampleApplication.class, args);

? ? }

}


spring.application.name=stream-consumer-groupserver.port=0


這里設(shè)置server.port=0,以方便在本地啟動多實例來重現(xiàn)問題榨汤。

完成上述操作之后蠕搜,啟動兩個該應(yīng)用的實例,以備后續(xù)調(diào)用收壕。

構(gòu)建消息生產(chǎn)端

比較簡單妓灌,需要注意的是,使用@Output創(chuàng)建一個同名的輸出綁定蜜宪,這樣發(fā)出的消息才能被上述啟動的實例接收到虫埂。具體實現(xiàn)如下:

@RunWith(SpringRunner.class)@EnableBinding(value = {ExampleApplicationTests.ExampleBinder.class})public classExampleApplicationTests{

@Autowired private ExampleBinder exampleBinder;

@Test publicvoidexampleBinderTester(){

? ? ? ? exampleBinder.output().send(MessageBuilder.withPayload("Produce a message from : http://blog.didispace.com").build());

}

public interfaceExampleBinder{

String NAME = "example-topic";

@Output(NAME)

MessageChanneloutput();

}

}

啟動上述測試用例之后,可以發(fā)現(xiàn)之前啟動的兩個實例都收到的消息圃验,并在日志中打印了:Received: Produce a message from : http://blog.didispace.com掉伏。消息重復(fù)消費的問題成功重現(xiàn)!

使用消費組解決問題

如何解決上述消息重復(fù)消費的問題呢?我們只需要在配置文件中增加如下配置即可:

spring.cloud.stream.bindings.example-topic.group=aaa

當我們指定了某個綁定所指向的消費組之后斧散,往當前主題發(fā)送的消息在每個訂閱消費組中供常,只會有一個訂閱者接收和消費,從而實現(xiàn)了對消息的負載均衡鸡捐。只所以之前會出現(xiàn)重復(fù)消費的問題栈暇,是由于默認情況下,任何訂閱都會產(chǎn)生一個匿名消費組箍镜,所以每個訂閱實例都會有自己的消費組源祈,從而當有消息發(fā)送的時候,就形成了廣播的模式色迂。

另外香缺,需要注意上述配置中example-topic是在代碼中@Output和@Input中傳入的名字。

覺得不錯請點贊支持歇僧,歡迎留言或進我的個人群855801563領(lǐng)取【架構(gòu)資料專題目合集90期】图张、【BATJTMD大廠JAVA面試真題1000+】,本群專用于學(xué)習(xí)交流技術(shù)馏慨、分享面試機會埂淮,拒絕廣告,我也會在群內(nèi)不定期答題写隶、探討

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倔撞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慕趴,更是在濱河造成了極大的恐慌痪蝇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冕房,死亡現(xiàn)場離奇詭異躏啰,居然都是意外死亡,警方通過查閱死者的電腦和手機耙册,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門给僵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人详拙,你說我怎么就攤上這事帝际。” “怎么了饶辙?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵蹲诀,是天一觀的道長。 經(jīng)常有香客問我弃揽,道長脯爪,這世上最難降的妖魔是什么嘱蛋? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任飞几,我火速辦了婚禮晰韵,結(jié)果婚禮上拒逮,老公的妹妹穿的比我還像新娘显押。我一直安慰自己角骤,他們只是感情好讥邻,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布夷野。 她就那樣靜靜地躺著蒿辙,像睡著了一般拇泛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上思灌,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天俺叭,我揣著相機與錄音,去河邊找鬼泰偿。 笑死熄守,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的耗跛。 我是一名探鬼主播裕照,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼调塌!你這毒婦竟也來了晋南?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤羔砾,失蹤者是張志新(化名)和其女友劉穎负间,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姜凄,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡政溃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了态秧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片董虱。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖申鱼,靈堂內(nèi)的尸體忽然破棺而出愤诱,到底是詐尸還是另有隱情,我是刑警寧澤润讥,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布转锈,位于F島的核電站,受9級特大地震影響楚殿,放射性物質(zhì)發(fā)生泄漏撮慨。R本人自食惡果不足惜竿痰,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砌溺。 院中可真熱鬧影涉,春花似錦、人聲如沸规伐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猖闪。三九已至鲜棠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間培慌,已是汗流浹背豁陆。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吵护,地道東北人盒音。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像馅而,于是被迫代替她去往敵國和親祥诽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容