如何保證消息不被重複消費

如何保證消息不被重複消費啊(如何保證消息消費時的冪等性)?
首先就是比如rabbitmq、rocketmq、kafka,都有可能會出現消費重複消費的問題,正常。因爲這問題通常不是mq自己保證的,是給你保證的。然後我們挑一個kafka來舉個例子,說說怎麼重複消費吧。
kafka實際上有個offset的概念,就是每個消息寫進去,都有一個offset,代表他的序號,然後consumer消費了數據之後,每隔一段時間,會把自己消費過的消息的offset提交一下,代表我已經消費過了,下次我要是重啓啥的,你就讓我繼續從上次消費到的offset來繼續消費吧。
但是凡事總有意外,比如我們之前生產經常遇到的,就是你有時候重啓系統,看你怎麼重啓了,如果碰到點着急的,直接kill進程了,再重啓。這會導致consumer有些消息處理了,但是沒來得及提交offset,尷尬了。重啓之後,少數消息會再次消費一次。
消費者不是每消費一條數據就返回一個offset,而是定時返回offset

怎麼保證消息隊列消費的冪等性?

其實還是得結合業務來思考,我這裏給幾個思路:
(1)比如你拿個數據要寫庫,你先根據主鍵查一下,如果這數據都有了,你就別插入了,update一下好吧
(2)比如你是寫redis,那沒問題了,反正每次都是set,天然冪等性
(3)比如你不是上面兩個場景,那做的稍微複雜一點,你需要讓生產者發送每條數據的時候,裏面加一個全局唯一的id,類似訂單id之類的東西,然後你這裏消費到了之後,先根據這個id去比如redis裏查一下,之前消費過嗎?如果沒有消費過,你就處理,然後這個id寫redis。如果消費過了,那你就別處理了,保證別重複處理相同的消息即可。
還有比如基於數據庫的唯一鍵來保證重複數據不會重複插入多條,我們之前線上系統就有這個問題,就是拿到數據的時候,每次重啓可能會有重複,因爲kafka消費者還沒來得及提交offset,重複數據拿到了以後我們插入的時候,因爲有唯一鍵約束了,所以重複數據只會插入報錯,不會導致數據庫中出現髒數據
如何保證MQ的消費是冪等性的,需要結合具體的業務來看
————————————————
版權聲明:本文爲CSDN博主「java_leejin」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/java_leejin/article/details/97611948

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章