訊息重複和丟失是kafka中很常見的問題,主要發生在以下三個階段:
生產者階段
broke階段
消費者階段
根本原因
生產傳送的訊息沒有收到正確的broke響應,導致生產者重試。
生產者發出一條訊息,broke落盤以後因為網路等種種原因傳送端得到乙個傳送失敗的響應或者網
絡中斷,然後生產者收到乙個可恢復的exception重試訊息導致訊息重複
說明:new kafkaproducer()後建立乙個後台執行緒kafkathread掃瞄recordaccumulator中是否有消
息;呼叫kafkaproducer.send()傳送訊息,實際上只是把訊息儲存到recordaccumulator中;
後台執行緒kafkathread掃瞄到recordaccumulator中有訊息後,將訊息傳送到kafka集群;
如果傳送成功,那麼返回成功;
如果傳送失敗,那麼判斷是否允許重試。如果不允許重試,那麼返回失敗的結果;如果允許重
試,把訊息再儲存到recordaccumulator中,等待後台執行緒kafkathread掃瞄再次傳送
可恢復異常說明
異常是retriableexception型別或者transactionmanager允許重試;retriableexception類繼承關
系如下:
記錄順序問題
如果設定 max.in.flight.requests.per.connection 大於1(預設5,單個連線上傳送的未確認
請求的最大數量,表示上乙個發出的請求沒有確認下乙個請求又發出了)。大於1可能會改變記錄的順
序,因為如果將兩個batch傳送到單個分割槽,第乙個batch處理失敗並重試,但是第二個batch處理成
功,那麼第二個batch處理中的記錄可能先出現被消費。
設定 max.in.flight.requests.per.connection 為1,可能會影響吞吐量,可以解決單個生產者
傳送順序問題。如果多個生產者,生產者1先傳送乙個請求,生產者2後傳送請求,此時生產者1返回可
恢復異常,重試一定次數成功了。雖然生產者1先傳送訊息,但生產者2傳送的訊息會被先消
生產者傳送重複解決方案
啟動kafka的冪等性
要啟動kafka的冪等性,設定: enable.idempotence=true ,以及 ack=all 以及 retries > 1 。
ack=0,不重試。
可能會丟訊息,適用於吞吐量指標重要性高於資料丟失,例如:日誌收集
ack=1,leader crash
生產者傳送訊息完,只等待leader寫入成功就返回了,leader分割槽丟失了,此時follower沒來及同步,訊息丟失。
unclean.leader.election.enable 配置true
允許選舉isr以外的副本作為leader,會導致資料丟失,預設為false。生產者傳送非同步訊息,只等待lead寫入成功就返回,leader分割槽丟失,此時isr中沒有follower,leader從osr中選舉,因為osr中本來落後於leader造成訊息丟失
禁用unclean選舉,ack=all
ack=all / -1,tries > 1,unclean.leader.election.enable : false
生產者發完訊息,等待follower同步完再返回,如果異常則重試。副本的數量可能影響吞吐量,不超過5個,一般三個。
不允許unclean leader選舉
配置:min.insync.replicas > 1
失敗的offset單獨記錄
生產者傳送訊息,會自動重試,遇到不可恢復異常會丟擲,這時可以捕獲異常記錄到資料庫或快取,進行單獨處理
消費者資料重複場景及解決方案
根本原因
資料消費完沒有及時提交offset到broker
解決方案
kafka訊息重複和丟失的場景及解決方案分析
一 訊息丟失和重複消費 生產者 1 生產者丟失訊息 1 丟失場景 配置檔案裡面,ack設定為0,也就是生產者傳送之後,不管分割槽副本 leader和follower 是否收到都不管了,如果傳送失敗,就會訊息丟失。ack設定為1,也就是生產者傳送之後,只要leader接收到了,就會返回成功,follo...
開發技術 解決kafka訊息重複消費
1.需求 近來有小夥伴反應他負責的那塊服務出現了kafka訊息重複消費的問題。2.解決 出現重複消費的原因 消費者 consumer 依據偏移量 offset 讀取訊息,消費完訊息後,會向kafka的節點 broker 傳送乙個訊息被消費的反饋,也就是提交該訊息的偏移量,然後broker更新對應訊息...
kafka訊息丟失和訊息重複的情況
kafka作為訊息佇列,一定會有訊息丟失和訊息重複的問題,那什麼場景下會出現這種情況呢?kafka有乙個引數叫做acks。當生產者向leader傳送訊息後,會返回乙個確認的訊息給生產者。但是什麼時候leader會傳送確認訊息返回給生產者呢?就是通過acks這個引數決定的,這個引數有三種情況0 1 1...