我只是Kafka的新手,对kafka生产者的幂等性有所了解。
据我了解,当生产者向代理发送消息时,代理需要向生产者发回 ACK 以告知其已收到消息。如果生产者由于某种原因没有收到 ACK,则生产者必须再次向代理发送相同的消息,以便复制消息。而幂等生产者可以消除这个问题。
基本上,每个生产者都将被分配一个 PID,每个消息将被分配一个序列号。所以PID+序列号可以识别一条消息。这就是 kafka 的幂等性的工作原理。
如果我是对的,假设我为一个主题创建了三个分区,生产者通过轮询算法向三个分区发送消息,也就是说三个分区将一个接一个地接收消息。在这种情况下,Kafka 还能保证幂等性吗?
例如,有 a、b 和 c 三个分区。
在某个时刻,生产者正在向分区 a 发送消息 X,a 成功接收到 X,但在发送回 ACK 时失败。所以生产者重新发送消息X。现在我有两个问题:
- 是分区 a 还是分区 b 会收到最新的消息 X?
- 如果是分区b,是不是意味着分区a和分区b会有相同的消息X,也就是说这种情况下Kafka不能保证幂等性?