![](/img/trans.png)
[英]Kafka - Multiple producers writing to same topic and order of message is important
[英]Kafka ordering with multiple producers on same topic and parititon
假设我有两个生产者(ProducerA 和 ProducerB)使用单个分区写入同一主题。 每个生产者都在连续编写自己独特的事件。 因此,如果 ProducerA 触发 3 个事件,然后 ProducerB 触发 3 个事件,我的理解是 Kafka 无法保证生产者事件的顺序如下:
由于确认,重试等。
然而,个别制作人的活动仍会正常进行吗? 例如:
这当然是我正在做的事情的简化版本,但我只想保证,如果我正在阅读特定生产者事件的主题,那么即使其他生产者的事件将它们交错,这些事件也将是有序的。
在 medium 上有一篇很好的文章指出,即使对于同一个生产者,Kafka 也并不总是保证消息的顺序。 这一切都取决于 Kafka 配置。 特别是, max.in.flight.requests.per.connection
必须设置为1
。 原因是如果有多个请求(比如 2 个)在进行中并且第一个失败,第二个将更早地附加到日志中,从而破坏排序。
对此的简短回答是肯定的,将保证各个制作人的活动井然有序。
Kafka 中的消息按照它们发送的顺序附加到主题分区,消费者按照它们存储在主题分区中的相同顺序读取消息。
因此,假设您对来自生产者 A 的消息感兴趣并且正在过滤其他所有内容,那么在给定的场景中,您可以预期来自生产者 A 的事件 1、2 和 3 将按顺序读取。
PS :不过,我很想了解仅使用一个分区背后的动机。 另外,关于你的声明:
因此,如果 ProducerA 触发 3 个事件,然后 ProducerB 触发 3 个事件,我的理解是 Kafka 无法保证生产者事件的顺序如下:
您说整体排序是正确的,无法保证,但可以保证分区内的排序。
我希望这有帮助。
生产者的消息将按照接收到的顺序按分区存储。 如果您可以保证生产者的消息排序,那么消费者在轮询时就可以假设排序。 重试逻辑、多个KafkaProducer
实例和其他异步实现细节可能会使有序消息生产复杂化。 通常可以通过在消息的键或值中包含唯一的事件标识符、生产者的标识符和足够粒度的时间戳来缓解这些问题。 依赖于异步框架中的排序通常是最好的案例流程,但是当事情发生混乱时应该有一些方法来补偿。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.