producer 數據不丟失:
-
同步模式:配置=1 (只有Leader收到,-1 所有副本成功,0 不等待)Leader Partition掛了,數據就會丟失
解決:設置 -1 保證produce 寫入所有副本算成功producer.type = sync request.required.acks=-1
-
異步模式,當緩衝區滿了,如果配置爲0(沒有收到確認,一滿就丟棄),數據立刻丟棄
解決:不限制阻塞超時時間。就是一滿生產者就阻塞
producer.type = async
request.required.acks=1
queue.buffering.max.ms=5000
queue.buffering.max.messages=10000
queue.enqueue.timeout.ms = -1
batch.num.messages=200
Customer 不丟失數據
- 在獲取kafka的消息後正準備入庫(未入庫),但是消費者掛了,那麼如果讓kafka自動去維護offset它就會認爲這條數據已經被消費了,那麼會造成數據丟失。
解決:使用kafka高級API,自己手動維護偏移量,當數據入庫之後進行偏移量的更新(適用於基本數據源)
流式計算。高級數據源以kafka爲例,由2種方式:receiver (開啓WAL,失敗可恢復) director (checkpoint保證)
流處理中的幾種可靠性語義:
-
at most once 每條數據最多被處理一次(0次或1次),會出現數據丟失的問題
-
at least once 每條數據最少被處理一次(1次或更多),這個不會出現數據丟失,但是會出現數據重複
-
exactly once 每種數據只會被處理一次,沒有數據丟失,沒有數據重複,這種語義是大家最想實現的,也是最難實現的
但是開啓WAL後,依舊存在數據丟失問題,原因是任務中斷時receiver 也被強行終止了,將會造成數據丟失
在Streaming程序的最後添加代碼,只有在確認所有receiver都關閉的情況下才終止程序