關于RocketMQ的基本原理與實踐,可拜讀大神的文章:分布式開放消息系統(RocketMQ)的原理與實踐
大神的文章分析了RocketMQ實現順序消息的原理,由此引出一個新問題:如何解決重復消息問題?
大神給出的回答是:
RocketMQ不保證消息不重復,如果你的業務需要保證嚴格的不重復消息,需要你自己在業務端去重。
意不意外,驚不驚喜?
趕緊回歸正題,業務端如何去重呢?原理很簡簡單,步驟如下:
1、記錄下每個消息的msgID
2、新消息來的時候,查看該消息的msgID是否已記錄,是則拋棄,否則消費
那么msgID記錄在哪里呢?當然是緩存。所以我在解決這個問題的時候,使用了redis緩存。具體做法如下:
1、消費端接收到消息的時候,調用redis提供的incr方法,以msgID作為key(具有唯一性),value則默認從1開始遞增。
2、當incr返回值為1時,設置其失效時間為兩分鐘以后(每個msgID保留兩分鐘足矣!),并且該消息需要被消費。
3、當incr返回值大于1時,則忽略該消息。
部分代碼如下:
這樣就在業務端簡單有效地解決了重復消息問題。