如何保證kafka消息不丟失

image.png

背景

這裏的kafka值得是broker,broker消息丟失的邊界須要對齊一下:程序員

1 已經提交的消息編程

2 有限度的持久化網絡

若是消息沒提交成功,並非broke丟失了消息;多線程

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

生產者丟失消息

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

失敗的緣由可能有不少,好比網絡抖動,發送消息超出大小限制;學習

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

經過callback能夠準確的告訴你消息是否發送成功了,發送失敗了你也能夠有處置方法;3d

網絡抖動: 重發code

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

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

消費者丟失消息

kafka消費消息的模型:

image.png

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

file

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

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

多線程消費丟失消息

即開啓了位移自動提交,多線程處理的時候,若是有一個線程出現問題,可是仍是提交了位移,會發生消息丟失。

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

調優broker參數防止消息丟失

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

file

而後就是producer發送消息必定要使用帶回調函數的方法,並對發送失敗的狀況進行處理。

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

小結

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

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

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

相關文章
相關標籤/搜索