首页 > 解决方案 > kafka幂等生产者可以确保多个分区恰好一次吗

问题描述

我只是Kafka的新手,对kafka生产者的幂等性有所了解。

据我了解,当生产者向代理发送消息时,代理需要向生产者发回 ACK 以告知其已收到消息。如果生产者由于某种原因没有收到 ACK,则生产者必须再次向代理发送相同的消息,以便复制消息。而幂等生产者可以消除这个问题。

基本上,每个生产者都将被分配一个 PID,每个消息将被分配一个序列号。所以PID+序列号可以识别一条消息。这就是 kafka 的幂等性的工作原理。

如果我是对的,假设我为一个主题创建了三个分区,生产者通过轮询算法向三个分区发送消息,也就是说三个分区将一个接一个地接收消息。在这种情况下,Kafka 还能保证幂等性吗?

例如,有 a、b 和 c 三个分区。

在某个时刻,生产者正在向分区 a 发送消息 X,a 成功接收到 X,但在发送回 ACK 时失败。所以生产者重新发送消息X。现在我有两个问题:

  1. 是分区 a 还是分区 b 会收到最新的消息 X?
  2. 如果是分区b,是不是意味着分区a和分区b会有相同的消息X,也就是说这种情况下Kafka不能保证幂等性?

标签: apache-kafkaidempotentexactly-once

解决方案


在某个时刻,生产者正在向分区 a 发送消息 X,a 成功接收到 X,但在发送回 ACK 时失败。所以生产者重新发送消息 X。

是分区 a 还是分区 b 会收到最新的消息 X?

重新发送是在内部完成的,我们不在应用程序代码中进行。因此,当X发送到分区的消息A没有收到确认时,它将被重新发送到同一个分区。如果我们手动重新发送应用程序代码,那么的,会有重复。

如果分区逻辑是循环的,则一条消息将被发送到下一个分区。分区逻辑不适用于重新发送,即如果消息发送失败,则将其重新发送到同一分区。

如果是分区b,是不是意味着分区a和分区b会有相同的消息X,也就是说这种情况下Kafka不能保证幂等性?

这不适用,因为重新发送总是发送到同一个分区。分区逻辑只会在消息发送前执行一次,而不是每次重试。


推荐阅读