kafka幂等生产者能否确保多个分区恰好一次

Can kafka idempotent producer ensure exactly once with multiple partitions

我只是Kafka的新手,对kafka producer的幂等性了解了一些。

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

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

如果我没猜错的话,假设我为一个topic创建了三个partition,一个producer通过round robin算法向三个partition发送消息,也就是说三个partition会一个接一个的收到消息。这样的话,Kafka还能保证幂等吗?

比如有a,b,c三个分区

某时刻,生产者正在向分区a发送消息X,a成功收到X,但未能返回ACK。于是producer重发消息X。现在我有两个问题:

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

At some moment, the producer is sending the message X to the partition a, a receives the X successfully but fails on sending back the ACK. So the producer resend the message X.

It would be the partition a or the partition b, which will receive the latest message X?

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

如果分区逻辑是round-robin,则next消息将被发送到下一个分区。分区逻辑不适用于重新发送,即如果消息发送失败,它将重新发送到同一分区。

If it's the partition b, does it mean that the partition a and partition b will have the same message X, meaning that Kafka can't ensure idempotence in this case?

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