apache-kafka - kafka幂等生产者可以确保多个分区恰好一次吗
问题描述
我只是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不能保证幂等性?
解决方案
在某个时刻,生产者正在向分区 a 发送消息 X,a 成功接收到 X,但在发送回 ACK 时失败。所以生产者重新发送消息 X。
是分区 a 还是分区 b 会收到最新的消息 X?
重新发送是在内部完成的,我们不在应用程序代码中进行。因此,当X
发送到分区的消息A
没有收到确认时,它将被重新发送到同一个分区。如果我们手动重新发送应用程序代码,那么是的,会有重复。
如果分区逻辑是循环的,则下一条消息将被发送到下一个分区。分区逻辑不适用于重新发送,即如果消息发送失败,则将其重新发送到同一分区。
如果是分区b,是不是意味着分区a和分区b会有相同的消息X,也就是说这种情况下Kafka不能保证幂等性?
这不适用,因为重新发送总是发送到同一个分区。分区逻辑只会在消息发送前执行一次,而不是每次重试。
推荐阅读
- python - ImportError:没有名为“selenium”的模块 - 需要运行 setup.py
- php - 仅当它在自己的行上时才删除它
- c# - SignalR 客户端在释放模式 (UWP) 下不接收信号
- javascript - 如何切换响应式导航栏的可见性?
- powershell - - 包含 VS -in
- jsf - 如何使用 p:calendar 输出日期
- javadoc - Checkstyle 模块/属性来控制 Javadoc at 子句的对齐方式
- django - 表单不会将写入的地址保存到数据库
- mysql - 如何识别mysql中相同列中具有相同值的行?而且我还必须为这些行添加条件
- sed - 如何使用 sed 不删除与模式匹配的整行