消息重復消費,會造成數據混亂,特別是在涉及消費和財務系統里,此問題的解決顯得尤為重要。
以kafka為例
關鍵字:消費端自動提交offset;寫庫或者redis時,先去查一下主鍵、key等是否存在
上圖中,最頂上的文本框丟失的文字:並通知kafka當前最大offset;
最右邊的文本框丟失的文字:數據傳遞過來;
冪等性,通俗來說,就是一個數據或者一個請求給你重復來多次,你得確保對應的數據是不會改變的,不能出錯。
例如二次消費的時候,自己判斷一下,若已經消費過了,直接扔了,不就保留一條數據了嗎
所以重復消費的解決方案是:
方法1,比如消費者拿數據是要寫庫的,先根據主鍵查一下,有就不插入或者update,否則就插入
方法2,比如消費者是要寫redis,反正每次都是set,天然冪等性
方法3,生產者發送每條數據時,加一個全局的唯一id,類似訂單id,到消費者消費的時候,先拿id去比如redis里查一下,之前若沒消費過,就處理id寫redis,若消費過,就不處理了,保證別重復消費相同 的消息即可;
方法4,或者基於數據庫的唯一鍵來保證重復數據不會重復插入多條,跟方法1類似。