解決策略:html
一、異步方式緩衝區滿了,就阻塞在那,等着緩衝區可用,不能清空緩衝區緩存
二、發送消息以後回調函數,發送成功就發送下一條,安全
發送失敗就記在日誌裏,等着定時腳本(定時器)來掃描異步
(發送失敗可能並不真的發送失敗,只是沒收到反饋,定時腳本可能會重發)函數
如何保證有序(同步發送能保證順序):日誌
同步發送模式:發出消息後,必須阻塞等待收到通知後,才發送下一條消息htm
異步發送模式:一直往緩衝區寫,而後一把寫到隊列中去blog
二者都是各有利弊:隊列
同步發送模式雖然吞吐量小,可是發一條收到確認後再發下一條,既能保證不丟失消息,又能保證順序get
kafka數據丟失緣由:
有3種狀態(0(不須要等待確認)、1(leader確認)、-1(all確認))保證消息被安全生產,
在配置狀態爲1(只保證寫入leader成功的話),若是恰好leader partition掛了,數據就會丟失
使用異步模式的時候,當緩存區滿了,
若是配置狀態爲0(還沒收到確認的狀況下,緩衝池一滿,就清空緩衝池裏的消息),數據就會被立馬丟棄掉
若是配置狀態爲-1
因爲ISR可能會縮小到僅包含一個Replica,因此設置參數爲all並不能必定避免數據丟失
在數據生產時避免數據丟失的方法: