kafka是如何保證消息不被重複消費的

一、kafka自帶的消費機制

  kafka有個offset的概念,當每個消息被寫進去後,都有一個offset,代表他的序號,然後consumer消費該數據之後,隔一段時間,會把自己消費過的消息的offset提交一下,代表我已經消費過了。下次我要是重啓,就會繼續從上次消費到的offset來繼續消費。

  但是當我們直接kill進程了,再重啓。這會導致consumer有些消息處理了,但是沒來得及提交offset。等重啓之後,少數消息就會再次消費一次。

  其他MQ也會有這種重複消費的問題,那麼針對這種問題,我們需要從業務角度,考慮它的冪等性。

 

二、通過保證消息隊列消費的冪等性來保證

  舉個例子,當消費一條消息時就往數據庫插入一條數據。如何保證重複消費也插入一條數據呢?

  那麼我們就需要從冪等性角度考慮了。冪等性,我通俗點說,就一個數據,或者一個請求,無論來多次,對應的數據都不會改變的,不能出錯。

 

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

我們需要結合業務來思考,比如下面的例子:

  1.比如某個數據要寫庫,你先根據主鍵查一下,如果數據有了,就別插入了,update一下好吧

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

  3.對於消息,我們可以建個表(專門存儲消息消費記錄)

    生產者,發送消息前判斷庫中是否有記錄(有記錄說明已發送),沒有記錄,先入庫,狀態爲待消費,然後發送消息並把主鍵id帶上。

    消費者,接收消息,通過主鍵ID查詢記錄表,判斷消息狀態是否已消費。若沒消費過,則處理消息,處理完後,更新消息記錄的狀態爲已消費。

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