上篇博客主要講了消息可靠性傳遞,那麼是不是大家也想了解怎麼保證消息隊列消費的冪等性?
如何保證MQ的消費是冪等性的,需要結合具體的業務來看 :
比如你拿個數據要寫庫,你先根據主鍵查一下,如果這數據都有了(最好帶有時間戳字段,每次更新都以時間戳爲條件),你就別插入了,update一下好吧
比如你是寫redis,那沒問題了,反正每次都是set,天然冪等性
比如你不是上面兩個場景,那做的稍微複雜一點,你需要讓生產者發送每條數據的時候,裏面加一個全局唯一的id,類似訂單id之類的東西,然後你這裏消費到了之後,先根據這個id去比如redis裏查一下,之前消費過嗎?如果沒有消費過,你就處理,然後這個id寫redis。如果消費過了,那你就別處理了,保證別重複處理相同的消息即可。
還有比如基於數據庫的唯一鍵來保證重複數據不會重複插入多條,拿到數據的時候,每次重啓可能會有重複,因爲kafka消費者還沒來得及提交offset,重複數據拿到了以後我們插入的時候,因爲有唯一鍵約束了,所以重複數據只會插入報錯,不會導致數據庫中出現髒數據