如何保證RabitMQ消息不被重複消費(如何保證消息消費時的冪等性)

上篇博客主要講了消息可靠性傳遞,那麼是不是大家也想了解怎麼保證消息隊列消費的冪等性?

如何保證MQ的消費是冪等性的,需要結合具體的業務來看  :

  比如你拿個數據要寫庫,你先根據主鍵查一下,如果這數據都有了(最好帶有時間戳字段,每次更新都以時間戳爲條件),你就別插入了,update一下好吧 

  比如你是寫redis,那沒問題了,反正每次都是set,天然冪等性  

  比如你不是上面兩個場景,那做的稍微複雜一點,你需要讓生產者發送每條數據的時候,裏面加一個全局唯一的id,類似訂單id之類的東西,然後你這裏消費到了之後,先根據這個id去比如redis裏查一下,之前消費過嗎?如果沒有消費過,你就處理,然後這個id寫redis。如果消費過了,那你就別處理了,保證別重複處理相同的消息即可。  

  還有比如基於數據庫的唯一鍵來保證重複數據不會重複插入多條,拿到數據的時候,每次重啓可能會有重複,因爲kafka消費者還沒來得及提交offset,重複數據拿到了以後我們插入的時候,因爲有唯一鍵約束了,所以重複數據只會插入報錯,不會導致數據庫中出現髒數據   

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