RocketMQ重復消息終極解決方案

關于RocketMQ的基本原理與實踐,可拜讀大神的文章:分布式開放消息系統(RocketMQ)的原理與實踐

大神的文章分析了RocketMQ實現順序消息的原理,由此引出一個新問題:如何解決重復消息問題?

大神給出的回答是:

RocketMQ不保證消息不重復,如果你的業務需要保證嚴格的不重復消息,需要你自己在業務端去重。

意不意外,驚不驚喜?

趕緊回歸正題,業務端如何去重呢?原理很簡簡單,步驟如下:

1、記錄下每個消息的msgID
2、新消息來的時候,查看該消息的msgID是否已記錄,是則拋棄,否則消費

那么msgID記錄在哪里呢?當然是緩存。所以我在解決這個問題的時候,使用了redis緩存。具體做法如下:

1、消費端接收到消息的時候,調用redis提供的incr方法,以msgID作為key(具有唯一性),value則默認從1開始遞增。

2、當incr返回值為1時,設置其失效時間為兩分鐘以后(每個msgID保留兩分鐘足矣!),并且該消息需要被消費。

3、當incr返回值大于1時,則忽略該消息。

部分代碼如下:



這樣就在業務端簡單有效地解決了重復消息問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容