什么是生产者幂等性?
幂等性(Idempotency)是指一个操作,无论执行多少次,其结果都与执行一次的结果相同。
对于涉及支付、订单、库存等关键业务的系统,数据重复写入是不可接受的,必须保证消息写入“唯一性”——这正是幂等性要解决的问题。
而Kafka 生产幂等性,是指 Kafka 生产者在向 Broker 发送消息时。
即使因为网络抖动或 Broker 临时故障等原因进行了多次重试发送,Broker 端最终也只会持久化一条相同的消息。
换句话说,对于生产者发送的同一条消息,无论发送多少次,其对 Broker 状态的影响都与只发送一次相同。
Kafka实现幂等性实现原理
Kafka的幂等性实现,依赖于三个核心组件的协同工作:
生产者ID(Producer ID, PID)
每个生产者实例,在初始化时从broker获取的唯一标识符(PID)。
这个 PID 在该生产者的整个会话期间(从连接建立到断开)保持不变,即使生产者因为故障重启,它也会尝试恢复之前的 PID。
PID的全局唯一性:是实现精确去重的基础。
序列号(Sequence Number)
生产者为每个消息分区维护的单调递增计数器,这个序列号与PID共同构成消息的唯一性标识。
对于同一个 PID,发送的第一条消息的序列号通常从 0 开始,后续每发送一条消息,序列号就递增 1。
序列号的作用是标识同一个生产者发送的消息的顺序。
Broker 端存储
对于每个 <PID, Partition>
组合,Kafka Broker 会在内存中(或者更持久化的存储,取决于具体实现)维护一个最新的已提交消息的序列号 。
Kafka 生产幂等性,大致流程如下:
- 唯一标识生产者: 使用 PID 唯一标识每个启用了幂等性的生产者实例。
- 顺序编号消息: 使用单调递增的序列号标识同一个生产者发送的消息的顺序。
- Broker 端状态维护: Broker 维护每个
<PID, Partition>
最近成功提交的序列号。 - 序列号比对和去重: Broker 根据 PID 和序列号判断接收到的消息是否是重复的,如果是则丢弃。
- 保证消息顺序: Broker 通过检查序列号的连续性,防止乱序写入,并能检测到潜在的消息丢失。
通过这种机制,即使生产者因为网络问题/或其他原因重试发送相同的消息,Broker 也能够识别并保证每个消息在特定的 Partition 中只被成功写入一次。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》