1. 程式人生 > >Kafka重複消費

Kafka重複消費

目錄
1.出現的情況
2.解決方案

出現的情況

1.crash來不及提交Offset

  • 讀完訊息先commit(提交Offset),再處理訊息 => commit後,還沒來得及處理就crash
    • 實際是沒有處理,但是Offset已經提交, 丟失消費
  • 讀完訊息,處理訊息後,再commit(提交Offset) => 處理完訊息後,還沒commit就crash
    • 實際處理完,但是Offset還沒有提交, 重複消費

2.在session時間內未提交Offset

kafka的consumer消費資料時首先會從broker裡讀取一批訊息資料進行處理,處理完成後再提交offset。而我們專案中的consumer消費能力比較低,導致取出的一批資料在session.timeout.ms時間內沒有處理完成,自動提交offset失敗,然後kafka會重新分配partition給消費者,消費者又重新消費之前的一批資料,又出現了消費超時,所以會造成死迴圈,一直消費相同的資料。  

解決方案

針對上述情況1.

1.放棄效率換取可靠性
讀完訊息,處理訊息後,再commit(提交Offset),本地收到訊息,持久化訊息到資料庫(記錄ID,10001),提交Offset後,才清空資料庫改記錄.冗機後,重啟啟動,如果資料庫沒有改記錄則可以消費下一條,有的話,則從記錄開始的ID開始消費
效率太低,但是確保.每讀完一條訊息呼叫一下consumer.commitOffsets()

2.或者不理會重複消費情況,客戶端的處理邏輯
每條訊息有其特定的標識,在處理訊息前,查詢資料庫是否存在該記錄,存在則放棄,反之出處理(訊息可以使用唯一id標識)