Kafka重複消費,不丟失數據

kafka0.11.0.0版本正式支持精確一次處理語義exactly once semantic–EOS
kafka冪等性參考
1)冪等producer 保證單個分區的只會發送一次,不會出現重複消息
2)事務(transation):保證原子性的寫入多個分區,即寫入到多個分區的消息要麼全部成功,要麼全部回滾
3)流式EOS:流處理本質上可看成是“”讀取-處理-寫入的管道“”。此EOS保證整個過程的操作是原子性。注意,只使用kafka Stream

  1. https://blog.csdn.net/qq_35078688/article/details/86082858
  2. https://www.cnblogs.com/jingangtx/p/11330338.html

1.如何解決重複消費

重複問題:rebalance問題,
1.通常會遇到消費的數據處理很耗時,導致超過了Kafka的session timeout時間(0.10.x版本默認是30秒),那麼就會rebalance重平衡,此時有一定機率offset沒提交,會導致重平衡後重復消費。
2.或者關閉kafka時,如果在close之前,調用consumer.unsubscribe()則可能有部分offset沒提交,下次重啓會重複消費。
3.消費程序和業務邏輯在一個線程,導致offset提交超時。

try {
consumer.unsubscribe();
} catch (Exception e) {
}

try {
consumer.close();
} catch (Exception e) {
}
 

解決方法
配置解決:offset自動提交爲false!
業務邏輯解決:自己提交偏移量,讓consumer邏輯冪等
啓用冪等producer:在producer程序中設置屬性enabled.idempotence=true,若要實現多分區上的原子性,需要引入事務,啓用事務支持:在producer程序中設置屬性transcational.id爲一個指定字符串(你可以認爲這是你的額事務名稱,故最好七個有意義的名字),同時設置enable.idempotence=true
冪等實現業務實現參考 https://www.cnblogs.com/huiandong/p/9402409.html

2.如何不丟失數據

生產者數據不丟失
同步模式:配置=1(只有Leader收到,-1所有副本成功,0不等待)。leader partition掛了,數據就會丟失。
解決:設置爲-1保證produce寫入所有副本算成功
          producer.type=sync
          request.required.acks=-1
異步模式,當緩衝區滿了,如果配置爲0(沒有收到確認,一滿就丟棄),數據立刻丟棄
解決:不限制阻塞超時時間。就是一滿生產者就阻塞
          producer.type=async
          request.required.acks=1
          queue.buffering.max.ms=5000
          queue.buffering.max.messages=10000
          queue.enqueue.timeout.ms = -1
          batch.num.messages=200

丟包問題發送數據過快,導致服務器網卡爆滿,或者磁盤處於繁忙狀態,可能會出現丟包現象。
丟包解決方法
1.啓用重試機制,重試間隔時間設置長一些
2.設置生產者(ack=all 代表至少成功發送一次) ,即需要相應的所有處於ISR的分區都確認收到該消息後,纔算發送成功。
3.對kafka進行限速(限速可能會引起rebalance問題)

rebalance問題參考可解決方案
https://www.cnblogs.com/fengdaye/p/11046264.html
消費者數據不丟失
receiver(開啓WAL,失敗可恢復)和director(checkpoint保證)

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