背景 這裡的kafka值得是broker,broker消息丟失的邊界需要對齊一下: 1 已經提交的消息 2 有限度的持久化 如果消息沒提交成功,並不是broke丟失了消息; 有限度的持久化(broker可用) 生產者丟失消息 這個發送消息的方式是非同步的;fire and forget,發送而不管結果 ...
背景
這裡的kafka值得是broker,broker消息丟失的邊界需要對齊一下:
1 已經提交的消息
2 有限度的持久化
如果消息沒提交成功,並不是broke丟失了消息;
有限度的持久化(broker可用)
生產者丟失消息
producer.send(Object msg) ;
這個發送消息的方式是非同步的;fire and forget,發送而不管結果如何;
失敗的原因可能有很多,比如網路抖動,發送消息超出大小限制;
怎麼破呢?永遠使用帶有返回值值的消息發送方式,即 producer.send(msg,callback)
通過callback可以準確的告訴你消息是否發送成功了,發送失敗了你也可以有處置方法;
網路抖動: 重發
發送消息超出大小:調整消息大小進行發送
這種情況並不是broker丟失消息了,是producer的消息沒有提交成功。
消費者丟失消息
kafka消費消息的模型:
即消費消息,設置好offset,類比一下:
說明時候消費者丟失數據呢?即先更新位移,再消費消息,如果消費程式出現故障,沒消費完畢,則丟失了消息,此時,broker並不知道。
怎麼破?總是先消費消息,再更新位移;這種可能帶來消息重覆消費的問題,但是不會出現消息丟失問題;
多線程消費丟失消息
即開啟了位移自動提交,多線程處理的時候,如果有一個線程出現問題,但是還是提交了位移,會發生消息丟失。
怎麼破? 關閉自動提交位移,消費者端配置參數:enable.auto.commit=false
調優broker參數防止消息丟失
主要通過調整配置來保證kafka消息不丟失。
然後就是producer發送消息一定要使用帶回調函數的方法,並對發送失敗的情況進行處理。
同時寫consumer程式的時候先消費再提交;
小結
本節先限定了kafka消息不丟失是針對broker的,基本要求是:消息已提交到broker,而且至少有一個broker可用;
然後從生產者,消費者,配置參數這三個方面介紹瞭如何防止kafka的消息丟失。
原創不易,關註誠可貴,轉發價更高!轉載請註明出處,讓我們互通有無,共同進步,歡迎溝通交流。
我會持續分享Java軟體編程知識和程式員發展職業之路,歡迎關註,我整理了這些年編程學習的各種資源,關註公眾號‘李福春持續輸出’,發送'學習資料'分享給你!