繁体   English   中英

Kafka 在同一主题和分区上与多个生产者进行排序

[英]Kafka ordering with multiple producers on same topic and parititon

假设我有两个生产者(ProducerA 和 ProducerB)使用单个分区写入同一主题。 每个生产者都在连续编写自己独特的事件。 因此,如果 ProducerA 触发 3 个事件,然后 ProducerB 触发 3 个事件,我的理解是 Kafka 无法保证生产者事件的顺序如下:

  1. ProducerA_event_1
  2. ProducerA_event_2
  3. ProducerA_event_3
  4. 生产者B_event_1
  5. ProducerB_event_2
  6. ProducerB_event_3

由于确认,重试等。

然而,个别制作人的活动仍会正常进行吗? 例如:

  1. ProducerA_event_1
  2. ProducerB_event_2
  3. 生产者B_event_1
  4. ProducerA_event_2
  5. ProducerA_event_3
  6. ProducerB_event_3

这当然是我正在做的事情的简化版本,但我只想保证,如果我正在阅读特定生产者事件的主题,那么即使其他生产者的事件将它们交错,这些事件也将是有序的。

在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM