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