天天看點

【kafka】生産者投遞消息exactly once 精準一次性(幂等性解決消息重複投遞)

上一節最後總結了分區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也會發生變化。