消息發送方式緩存
想清楚Kafka發送的消息是否丟失,須要先了解Kafka消息的發送方式。安全
Kafka消息發送分同步(sync)、異步(async)兩種方式網絡
默認是使用同步方式,可經過producer.type屬性進行配置;異步
Kafka保證消息被安全生產,有三個選項分別是0,1,-1async
經過request.required.acks屬性進行配置:ide
0表明:不進行消息接收是否成功的確認(默認值);ui
1表明:當Leader副本接收成功後,返回接收成功確認信息;orm
-1表明:當Leader和Follower副本都接收成功後,返回接收成功確認信息;同步
六種發送場景it
兩個維度相交,生成六種狀況,以下圖:


消息丟失的場景
網絡異常
acks設置爲0時,不和Kafka集羣進行消息接受確認,當網絡發生異常等狀況時,存在消息丟失的可能;
客戶端異常
異步發送時,消息並無直接發送至Kafka集羣,而是在Client端按必定規則緩存並批量發送。在這期間,若是客戶端發生死機等狀況,都會致使消息的丟失;
緩衝區滿了
異步發送時,Client端緩存的消息超出了緩衝池的大小,也存在消息丟失的可能;
Leader副本異常
acks設置爲1時,Leader副本接收成功,Kafka集羣就返回成功確認信息,而Follower副本可能還在同步。這時Leader副本忽然出現異常,新Leader副本(原Follower副本)未能和其保持一致,就會出現消息丟失的狀況;
以上就是消息丟失的幾種狀況,在平常應用中,咱們須要結合自身的應用場景來選擇不一樣的配置。
想要更高的吞吐量就設置:異步、ack=0;想要不丟失消息數據就選:同步、ack=-1策略
附:Kafka備份策略,不理解的能夠看個人另外一篇文章《Kafka消息的備份策略》

一個全棧程序猿的經驗分享,你們以爲有收穫的請在評論中給個鼓勵,不足之處也請多多指出;最後預祝你們開心永在,感謝您的關注。