Kafka是如何保障Producer的幂等性的

1. 什么是幂等性 Producer

在 Kafka 中,幂等性(Idempotence)指 同一条消息即使被 Producer 重复发送多次,也只会被 Broker 写入一次,不会出现重复消息。

为什么需要?

  • 网络波动或 Broker 返回超时时,Producer 可能会重试发送消息。
  • 如果没有幂等性,可能会出现消息重复,导致消费端数据不一致。

Kafka 从 0.11 版本引入幂等性机制。



2. 核心机制:Producer ID (PID) + Sequence Number

Kafka 通过 PID + Sequence Number 来实现幂等性:

  1. Producer ID (PID) 每个 Producer 在连接集群时会被分配一个 唯一的 64 位 Producer ID。 PID 是全局唯一的,由 Controller 统一管理。 latest_producer_id_block 就是 Controller 最近分配给 Producer 的 PID 范围,用于保证唯一性和批量分配。
  2. Sequence Number(序列号) 每条消息在发送时,Producer 会为每个分区分配一个 单调递增的序列号。 Kafka Broker 会记录每个 PID + 分区的 最后写入的序列号。


3. Broker 如何保障幂等性

当 Broker 收到 Producer 消息时,它会做以下检查:

  1. 检查 PID 是否有效 Broker 会在元数据中确认 PID 是否在已分配范围(latest_producer_id_block)内。
  2. 检查 Sequence Number 对每个 (PID, Partition),Broker 记录 last_sequence。 如果新消息的序列号 <= last_sequence,则认为是重复消息,直接丢弃。 如果序列号 = last_sequence + 1,消息正常写入。


4. Producer 重试场景

假设网络超时,Producer 会重试发送:

Producer发送 msg1 (seq=1) -> 网络超时 -> Broker 写入成功
Producer重试发送 msg1 (seq=1)
  • Broker 收到第二条 msg1 时,检查 (PID, seq=1)
  • 发现 seq 已写入 → 丢弃消息
  • 这样就保证了 幂等性


5. Transaction(事务)与幂等性

  • 幂等性 Producer 是事务性 Producer 的基础。
  • Producer 可以开启事务,写入多条消息到不同分区。
  • Broker 使用 PID + seq + Transaction ID 来确保跨分区的原子提交。


6. 总结 Kafka 幂等性保障流程

  1. Producer 启动 向 Controller 申请 PID(使用 latest_producer_id_block 分配的 block)
  2. 消息发送 每条消息带上 (PID, seq, partition)
  3. Broker 接收 验证 PID 是否有效 检查 seq 是否连续 重复消息丢弃,保证每条消息只写入一次
  4. 网络重试 即使 Producer 发送多次,Broker 只会写一次
  5. 事务(可选) 幂等机制结合 Transaction ID,保障跨分区的事务一致性


💡 总结一句话

Kafka 的幂等性是通过 唯一 PID + 单调递增序列号 + Broker 检查机制 实现的,而 latest_producer_id_block 就是保证 PID 全局唯一的核心组件。


文章标签:

评论(0)