目录
概述
kafka中的消费语义
- at most once :可能会丢数据
- at least once :all +分区副本>=2 +min >=2 不丢失数据,但是数据可能重复
- exactly once :精准一次, 不丢不重
kafka的事务与幂等性官方速递
Apache Kafka Idempotent Producer - Avoiding message duplication
kafka中幂等性
当生产者向
topic
发送消息时,可能会出现问题,如短连接失败,当这种情况发生时,任何等待确认的消息都可以重新发或丢弃,但消息可能已经成功写入
topic
,也可能没有,这是没法知道的,如果是重新发送,可以会导致消息重复。不重新发送,消息基本上会丢失。
支持
java
是从
0.11
版本正式支持的。
配置
# 代码中配置
enable.idempotence:true
原理
每个生产者都会被分配一个生产者Id(PID),每次向
topic
发送消息时,都会包含自己的
PID
,此外,每条消息都会得到一个单调递增的序列号。生产者向
topic
发送消息时,都会为其维护一个单独的序例,在
broker
上,会在每个分区的基础上跟踪已成功写入的最大
PID
序列化号组合,当接收到较低的序列号时,它会被丢弃。
禁用幂等性后,可能会出现生产者异步向
topic
分区发送消息的情况,比如消息
M1
到
M10
。发送消息
7
后,连接失败。它已收到消息
1
至
3
的确认。因此,消息
4
、
5
、
6
和
7
被重新发送,然后是消息
8
到
10
。但代理实际上能够将除消息
7
之外的所有消息写入分区,因此现在存储在分区中的消息是:M1, M2, M3, M4, M5, M6, M4, M5, M6, M7, M8, M9, M10
但启用幂等性后,每条消息都有一个PID和序列号:
- M1 (PID: 1, SN: 1) - written to partition. For PID 1, Max SN=1
- M2 (PID: 1, SN: 2) - written to partition. For PID 1, Max SN=2
- M3 (PID: 1, SN: 3) - written to partition. For PID 1, Max SN=3
- M4 (PID: 1, SN: 4) - written to partition. For PID 1, Max SN=4
- M5 (PID: 1, SN: 5) - written to partition. For PID 1, Max SN=5
- M6 (PID: 1, SN: 6) - written to partition. For PID 1, Max SN=6
- M4 (PID: 1, SN: 4) - rejected, SN <= Max SN
- M5 (PID: 1, SN: 5) - rejected, SN <= Max SN
- M6 (PID: 1, SN: 6) - rejected, SN <= Max SN
- M7 (PID: 1, SN: 7) - written to partition. For PID 1, Max SN=7
- M8 (PID: 1, SN: 8) - written to partition. For PID 1, Max SN=8
- M9 (PID: 1, SN: 9) - written to partition. For PID 1, Max SN=9
- M10 (PID: 1, SN: 10) - written to partition. For PID 1, Max SN=10
版权归原作者 流月up 所有, 如有侵权,请联系我们删除。