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

上一節最後總結了分區HW高水位線的意義:緩存

  • 保證了副本數據之間的一致性
  • 保證了消費者消費數據的一致性
  • 不能保證數據投遞不丟失或者不重複。

今天就來解決消息丟失或者重複問題dom

producer發送消息的時候能夠設置ack等級:ide

at most once 最多一次
acks=0 只發送一次,丟數據,不會重複發送kafka

at 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中冪等性存在的問題:

  • 冪等性只解決了當前的會話且當前的分區的冪等性。跨分區、會話不能實現精準一次性投遞寫入。當producer重啓後,broker分配的PID(producer_id)會發生變化。切換分區後,Patition也發生了變化。最終致使<PID,Patition,SeqNumber>做爲主鍵的key也會發生變化。
相關文章
相關標籤/搜索