简介
幂等性:执行多次操作与执行一次操作的影响一致
kafka 生产者幂等性
kafka 生产者生产消息到 partition
如果直接发送消息,kafka 会将消息保存到分区中,但 kafka 会返回一个ACK 给生产者,标识当前操作是否成功,是否已经保存了这条消息。
如果 ACK 响应失败,生产者会重试,继续发送未发送成功的消息,kafka 又会保存一条一模一样的问题
配置幂等性
props.put("enable.idempotence", true);
幂等性原理
kafka 有一个 Producer ID 和 Sequence Number 的概念
- PID:每个生产者 Producer 在初始化时,会分配一个唯一的 PID,这个 PID 对用户来说是透明的
- Sequence Number:针对每个生产者发送到指定主题分区的消息都对应一个开始递增的 Sequence Number
步骤:
- kafka 发送消息携带 PID 和 Sequence Number 发送
- kafka 收到消息,一并保存下来。
- ACK 响应失败后,生产者重试,再次发送消息,根据 pid、 Sequence Number 判断是否需要再保存一条消息
- 判断条件:生产者发送的 Sequence Number 是否小于等于 partition 中消息对应的 sequence Number
- 成功保存消息,当前发送的 sequence Number = 0,spid 对应的 sequence 不保存消息