一、kafka自帶的消費機制
kafka有個offset的概念,當每個訊息被寫進去後,都有乙個offset,代表他的序號,然後consumer消費該資料之後,隔一段時間,會把自己消費過的訊息的offset提交一下,代表我已經消費過了。下次我要是重啟,就會繼續從上次消費到的offset來繼續消費。
但是當我們直接kill程序了,再重啟。這會導致consumer有些訊息處理了,但是沒來得及提交offset。等重啟之後,少數訊息就會再次消費一次。
其他mq也會有這種重複消費的問題,那麼針對這種問題,我們需要從業務角度,考慮它的冪等性。
二、通過保證訊息佇列消費的冪等性來保證
舉個例子,當消費一條訊息時就往資料庫插入一條資料。如何保證重複消費也插入一條資料呢?
那麼我們就需要從冪等性角度考慮了。冪等性,我通俗點說,就乙個資料,或者乙個請求,無論來多次,對應的資料都不會改變的,不能出錯。
怎麼保證訊息佇列消費的冪等性?
我們需要結合業務來思考,比如下面的例子:
1.比如某個資料要寫庫,你先根據主鍵查一下,如果資料有了,就別插入了,update一下好吧
2.比如你是寫redis,那沒問題了,反正每次都是set,天然冪等性
3.對於訊息,我們可以建個表(專門儲存訊息消費記錄)
生產者,傳送訊息前判斷庫中是否有記錄(有記錄說明已傳送),沒有記錄,先入庫,狀態為待消費,然後傳送訊息並把主鍵id帶上。
消費者,接收訊息,通過主鍵id查詢記錄表,判斷訊息狀態是否已消費。若沒消費過,則處理訊息,處理完後,更新訊息記錄的狀態為已消費。
kafka如何保證訊息不丟失不被重複消費
在解決這個問題之前,我們首先梳理一下kafka訊息的傳送和消費機制。kafka的訊息傳送機制分為同步和非同步機制。可以通過producer.type屬性進行配置。使用同步模式的時候,有三種狀態來保證訊息的安全生產。可以通過配置request.required.acks屬性。三個屬性分別如下 當ack...
如何保證訊息不被重複消費
如何保證訊息不被重複消費啊 如何保證訊息消費時的冪等性 首先就是比如rabbitmq rocketmq kafka,都有可能會出現消費重複消費的問題,正常。因為這問題通常不是mq自己保證的,是給你保證的。然後我們挑乙個kafka來舉個例子,說說怎麼重複消費吧。kafka實際上有個offset的概念,...
如何保證訊息不被重複消費?
如何保證訊息不被重複消費?或者說,如何保證訊息消費的冪等性?其實這是很常見的乙個問題,這倆問題基本可以連起來問。既然是消費訊息,那肯定要考慮會不會重複消費?能不能避免重複消費?或者重複消費了也別造成系統異常可以嗎?這個是 mq 領域的基本問題,其實本質上還是問你使用訊息佇列如何保證冪等性,這個是你架...