Kafka生产者如何实现幂等性?

什么是生产者幂等性?

幂等性(Idempotency)是指一个操作,无论执行多少次,其结果都与执行一次的结果相同。

对于涉及支付、订单、库存等关键业务的系统,数据重复写入是不可接受的,必须保证消息写入“唯一性”——这正是幂等性要解决的问题。

Kafka生产者如何实现幂等性?-mikechen

而Kafka 生产幂等性,是指 Kafka 生产者在向 Broker 发送消息时。

即使因为网络抖动或 Broker 临时故障等原因进行了多次重试发送,Broker 端最终也只会持久化一条相同的消息。

换句话说,对于生产者发送的同一条消息,无论发送多少次,其对 Broker 状态的影响都与只发送一次相同。

 

Kafka实现幂等性实现原理

Kafka的幂等性实现,依赖于三个核心组件的协同工作:

Kafka生产者如何实现幂等性?-mikechen

生产者ID(Producer ID, PID)

每个生产者实例,在初始化时从broker获取的唯一标识符(PID)。

这个 PID 在该生产者的整个会话期间(从连接建立到断开)保持不变,即使生产者因为故障重启,它也会尝试恢复之前的 PID。

PID的全局唯一性:是实现精确去重的基础。

序列号(Sequence Number)

生产者为每个消息分区维护的单调递增计数器,这个序列号与PID共同构成消息的唯一性标识。

对于同一个 PID,发送的第一条消息的序列号通常从 0 开始,后续每发送一条消息,序列号就递增 1。

序列号的作用是标识同一个生产者发送的消息的顺序。

Broker 端存储

对于每个 <PID, Partition> 组合,Kafka Broker 会在内存中(或者更持久化的存储,取决于具体实现)维护一个最新的已提交消息的序列号 。

Kafka 生产幂等性,大致流程如下:

Kafka生产者如何实现幂等性?-mikechen

  1. 唯一标识生产者: 使用 PID 唯一标识每个启用了幂等性的生产者实例。
  2. 顺序编号消息: 使用单调递增的序列号标识同一个生产者发送的消息的顺序。
  3. Broker 端状态维护: Broker 维护每个 <PID, Partition> 最近成功提交的序列号。
  4. 序列号比对和去重: Broker 根据 PID 和序列号判断接收到的消息是否是重复的,如果是则丢弃。
  5. 保证消息顺序: Broker 通过检查序列号的连续性,防止乱序写入,并能检测到潜在的消息丢失。

通过这种机制,即使生产者因为网络问题/或其他原因重试发送相同的消息,Broker 也能够识别并保证每个消息在特定的 Partition 中只被成功写入一次。

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

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

评论交流
    说说你的看法