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

tro*_*son 5 apache-kafka

假设我有两个生产者(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

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

Tim*_*fey 5

Medium 上有一篇很好的文章指出,即使对于同一个生产者,Kafka 也并不总是保证消息的排序。这一切都取决于 Kafka 配置。特别是,max.in.flight.requests.per.connection必须设置为1. 原因是,如果有多个请求(例如 2 个)正在运行,并且第一个请求失败,则第二个请求将更早附加到日志中,从而破坏顺序。


小智 2

生产者的消息将按接收顺序存储在每个分区中。如果您可以保证生产者上的消息顺序,那么消费者可以在轮询时假设顺序。重试逻辑、多个KafkaProducer实例和其他异步实现细节可能会使有序消息的生成变得复杂。通常,可以通过在消息的键或值中包含唯一的事件标识符、生产者的标识符以及足够粒度的时间戳来缓解这些问题。依赖异步框架中的排序通常是最好的情况流程,但是当事情发生混乱时应该有某种方法来补偿。