kafka 重啓consumer 重複消費問題

原文連接:https://blog.csdn.net/z1941563559/java/article/details/88753938html

問題描述:kafka的某些topic在消費完畢後一段時間,重啓惟一消費者,offset會重置爲最小offset從新消費,一直致使kafka消費的重複消費問題。
問題產生緣由:是offset信息過時致使的。我一直覺得消費者保持在線,最新位移信息是不會過時的。但即便消費者在線,位移信息也會如約過時。配置的數據保留時間log.retention.hours=168小時比位移保留時間offsets.retention.minutes=1440即24小時要長。offset信息過時後,重啓消費者。因爲找不到offset信息,會根據配置auto.offset.reset=earliest從最小位移開始消費,致使以前已經消費的數據再次被消費。

java

 

 

解決方案:apache

原文 :https://issues.apache.org/jira/browse/KAFKA-3806spa

調整log.retention.hours和offsets.retention.minutes的默認值

在特殊狀況下,將log.retention.hours(168小時= 7天)和offsets.retention.minutes(1440分鐘= 1天)的默認值結合使用可能很危險。偏移保留應始終大於對數保留。.net

咱們已經觀察到如下狀況和問題:日誌

  • 生產者更新已於兩天前禁止了該主題的數據生產,該主題未刪除。
  • 消費者使用了全部數據並正確分配了對Kafka的偏移量。
  • 消費者再也不對該主題進行抵消提交,由於沒有更多傳入數據,也沒有任何可確認的內容。(咱們已禁用自動提交功能,我不肯定啓用自動提交的行爲方式。)
  • 一天後:Kafka根據offsets.retention.minutes清除了太舊的偏移量。
  • 兩天後:長期運行的使用者在更新後從新啓動,因爲該主題已被offsets.retention.minutes刪除,所以未找到該主題的任何已提交偏移量,所以從一開始就開始使用它。
  • 因爲log.retention.hours較長,消息仍在Kafka中,大約5天的消息被再次讀取。

解決此問題的已知解決方法:htm

  • 顯式配置log.retention.hours和offsets.retention.minutes,不要使用默認值。

提案:blog

  • 將offsets.retention.minutes的默認值延長到至少比log.retention.hours大兩倍。
  • 在Kafka啓動期間檢查這些值,若是offsets.retention.minutes小於log.retention.hours,則記錄警告。
  • 在遷移指南中添加一條註釋,以瞭解ZooKeeper和Kafka中存儲偏移量之間的區別(http://kafka.apache.org/documentation.html#upgrade)。

 

 

修改:get

默認參數 offsets.retention.minutes & log.retention.minutes 的默認值問題。kafka

默認參數前者是7天,後者是24小時。會致使數據雖然保存但offset失效致使客戶端數據重複消費的問題。

0.10.0.0官方的參數說明:http://kafka.apache.org/0100/documentation.html#log

offsets.retention.minutes

Log retention window in minutes for offsets topic

Kafka Server端保存的offset的過時時間。默認值1440(1440分鐘也就是24小時),應該調整爲與log.retention.hours一致,即10080。

 

log.retention.hours & log.retention.minutes

這兩個參數都是用來設置刪除日誌的,不管哪一個屬性已經溢出,都會進行文件的刪除。

log.retention.hours: 
The number of hours to keep a log file before deleting it (in hours), tertiary to log.retention.ms property
參數int類型,默認值:168 (168小時也就是7天)。

log.retention.minutes: The number of minutes to keep a log file before deleting it (in minutes), secondary to log.retention.ms property. If not set, the value in log.retention.hours is used參數int類型,默認值:null。

相關文章
相關標籤/搜索