上一節最後總結了分區HW高水位線的意義:緩存
- 保證了副本數據之間的一致性
- 保證了消費者消費數據的一致性
- 不能保證數據投遞不丟失或者不重複。
今天就來解決消息丟失或者重複問題dom
producer發送消息的時候能夠設置ack等級:ide
at most once 最多一次
acks=0 只發送一次,丟數據,不會重複發送kafkaat lestest once 最少一次
acks=-1或者all,不丟失數據,但可能重複數據。it
如何實現消息投遞exactly once 精準一次性?io
目標:不丟失數據,不重複數據。class
至少一次能夠保證數據不丟失,再進行去重便可。test
at lestest once+冪等性= exactly once原理
冪等性解釋:
是指producer不管向broker發送了多少條重複的消息,broker只會持久化一條。總結
在producer中開啓enable.idompotence=true,此時默認就開啓了acks=-1|all
冪等性實現原理:
producer鏈接到broker的時候會分配一個PID (producer_id),producer發送消息到統一個分區partition的時候,消息會附帶一個sequence number序列號,broker會以<PID,Patition,SeqNumber>做爲主鍵key進行緩存,當具備至關的
主鍵key的消息進行提交的時候,Broker只會持久化一條。
kafka中冪等性存在的問題: