上一節最後總結了分區HW高水位線的意義: 保證了副本資料之間的一緻性 保證了消費者消費資料的一緻性 不能保證資料投遞不丢失或者不重複。
今天就來解決消息丢失或者重複問題
producer發送消息的時候可以設定ack等級:
at most once 最多一次 acks=0 隻發送一次,丢資料,不會重複發送 at lestest once 最少一次 acks=-1或者all,不丢失資料,但可能重複資料。
如何實作消息投遞exactly once 精準一次性?
目标:不丢失資料,不重複資料。
至少一次可以保證資料不丢失,再進行去重即可。
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中幂等性存在的問題:
幂等性隻解決了目前的會話且目前的分區的幂等性。跨分區、會話不能實作精準一次性投遞寫入。
當producer重新開機後,broker配置設定的PID(producer_id)會發生變化。切換分區後,Patition也發生了變化。最終導緻<PID,Patition,SeqNumber>作為主鍵的key也會發生變化。