關(guān)于RocketMQ的基本原理與實踐椿疗,可拜讀大神的文章:分布式開放消息系統(tǒng)(RocketMQ)的原理與實踐
大神的文章分析了RocketMQ實現(xiàn)順序消息的原理举庶,由此引出一個新問題:如何解決重復(fù)消息問題心褐?
大神給出的回答是:
RocketMQ不保證消息不重復(fù)蜈七,如果你的業(yè)務(wù)需要保證嚴(yán)格的不重復(fù)消息乱凿,需要你自己在業(yè)務(wù)端去重蚯撩。
意不意外础倍,驚不驚喜?
趕緊回歸正題胎挎,業(yè)務(wù)端如何去重呢沟启?原理很簡簡單,步驟如下:
1犹菇、記錄下每個消息的msgID
2德迹、新消息來的時候,查看該消息的msgID是否已記錄揭芍,是則拋棄胳搞,否則消費
那么msgID記錄在哪里呢?當(dāng)然是緩存称杨。所以我在解決這個問題的時候肌毅,使用了redis緩存。具體做法如下:
1姑原、消費端接收到消息的時候悬而,調(diào)用redis提供的incr方法,以msgID作為key(具有唯一性)页衙,value則默認(rèn)從1開始遞增摊滔。
2阴绢、當(dāng)incr返回值為1時,設(shè)置其失效時間為兩分鐘以后(每個msgID保留兩分鐘足矣<杼伞)呻袭,并且該消息需要被消費。
3腺兴、當(dāng)incr返回值大于1時左电,則忽略該消息。
部分代碼如下:
這樣就在業(yè)務(wù)端簡單有效地解決了重復(fù)消息問題页响。