如何保證kafka消息不丟失


image.png

背景

這里的kafka值得是broker,broker消息丟失的邊界需要對齊一下:

1 已經提交的消息

2 有限度的持久化

如果消息沒提交成功,並不是broke丟失了消息;

有限度的持久化(broker可用)

生產者丟失消息

producer.send(Object msg) ; 
這個發送消息的方式是異步的;fire and forget,發送而不管結果如何;

失敗的原因可能有很多,比如網絡抖動,發送消息超出大小限制;

怎么破呢?永遠使用帶有返回值值的消息發送方式,即 producer.send(msg,callback)

通過callback可以准確的告訴你消息是否發送成功了,發送失敗了你也可以有處置方法;

網絡抖動: 重發

發送消息超出大小:調整消息大小進行發送

這種情況並不是broker丟失消息了,是producer的消息沒有提交成功。

消費者丟失消息

kafka消費消息的模型:

image.png

即消費消息,設置好offset,類比一下:

file

說明時候消費者丟失數據呢?即先更新位移,再消費消息,如果消費程序出現故障,沒消費完畢,則丟失了消息,此時,broker並不知道。

怎么破?總是先消費消息,再更新位移;這種可能帶來消息重復消費的問題,但是不會出現消息丟失問題;

多線程消費丟失消息

即開啟了位移自動提交,多線程處理的時候,如果有一個線程出現問題,但是還是提交了位移,會發生消息丟失。

怎么破? 關閉自動提交位移,消費者端配置參數:enable.auto.commit=false

調優broker參數防止消息丟失

主要通過調整配置來保證kafka消息不丟失。

file

然后就是producer發送消息一定要使用帶回調函數的方法,並對發送失敗的情況進行處理。

同時寫consumer程序的時候先消費再提交;

小結

本節先限定了kafka消息不丟失是針對broker的,基本要求是:消息已提交到broker,而且至少有一個broker可用;

然后從生產者,消費者,配置參數這三個方面介紹了如何防止kafka的消息丟失。

原創不易,關注誠可貴,轉發價更高!轉載請注明出處,讓我們互通有無,共同進步,歡迎溝通交流。
我會持續分享Java軟件編程知識和程序員發展職業之路,歡迎關注,我整理了這些年編程學習的各種資源,關注公眾號‘李福春持續輸出’,發送'學習資料'分享給你!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM