RocketMQ重復(fù)消息終極解決方案

關(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ù)消息問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容