Kafka与多个生产者就同一主题和parititon订购

时间:2018-08-28 21:59:27

标签: apache-kafka

比方说,我有两个生产者(ProducerA和ProducerB)用一个分区写同一主题。每个生产者都在依次编写自己的唯一事件。因此,如果ProducerA触发了3个事件,然后ProducerB触发了3个事件,那么我的理解是Kafka无法保证这样的生产者事件的顺序:

  1. ProducerA_event_1
  2. ProducerA_event_2
  3. ProducerA_event_3
  4. ProducerB_event_1
  5. ProducerB_event_2
  6. ProducerB_event_3

由于确认,重试等原因

不过,单个制作人的事件仍将井井有条吗?例如:

  1. ProducerA_event_1
  2. ProducerB_event_2
  3. ProducerB_event_1
  4. ProducerA_event_2
  5. ProducerA_event_3
  6. ProducerB_event_3

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

3 个答案:

答案 0 :(得分:1)

生产者的消息将按接收顺序存储在每个分区中。如果可以保证在生产者上进行消息排序,则消费者可以在轮询时承担排序的任务。重试逻辑,多个KafkaProducer实例以及其他异步实现细节可能会使有序消息的生成复杂化。通常,可以通过在消息的键或值中包含唯一的事件标识符,生产者的标识符以及足够粒度的时间戳来缓解这些问题。在异步框架中依赖排序通常是最好的情况,但是当事情出现故障时,应该有某种方法可以弥补。

答案 1 :(得分:0)

对此的简短回答是:是的,将保证单个制作人的事件井井有条。

Kafka中的消息按发送顺序附加到主题分区,并且使用者以与存储在主题分区中的顺序相同的顺序读取消息。

因此,假设您对生产者A的消息感兴趣并且正在过滤其他所有内容,那么在给定的情况下,可以预期生产者A的事件1、2和3将按顺序读取。

PS :但是,我很想了解仅使用一个分区的动机。另外,在您的声明中:

  

因此,如果ProducerA触发了3个事件,然后ProducerB触发了3个事件,   理解是,Kafka无法保证整个订单的顺序   制作人的事件,例如:

您说的是正确的,整体顺序是无法保证的,但是可以保证分区内的顺序。

我希望这会有所帮助。

答案 2 :(得分:0)

介质上有a nice article,其中指出,即使对于同一生产者,Kafka也不总是保证消息的顺序。这完全取决于Kafka的配置。特别是,max.in.flight.requests.per.connection必须设置为1。原因是如果有多个请求(例如2个)在运行中,而第一个请求失败,则第二个将更早地附加到日志中,从而破坏了顺序。