Kafka如何保证消费者跨分区处理消息排序?

时间:2018-01-25 16:48:54

标签: apache-kafka messaging kafka-consumer-api

来源:https://kafka.apache.org/intro

  

"通过并行主义的概念 - 主题内的分区,   Kafka能够提供订购保证和负载平衡   在一系列消费者流程中。这是通过分配   将主题中的分区分配给使用者组中的使用者   每个分区仅由组中的一个消费者使用。通过   这样做,我们确保消费者是唯一的读者   按顺序分区和使用数据。 "

这仅表示每个消费者将按顺序处理消息,但是在同一个消费者群体中的消费者中,它可能仍然无序。  例如:3个分区。订户通过循环将M1发送到P1,M2发送到P2,M3发送到P3,然后发送M4到P1,M5到P2,以及M6到P3。

现在我们有: P1:M1和M4 P2:M2和M5 P3:M3和M6

如果每个consuemr都绑定到一个分区,那么C1将按顺序处理M1和M4,C2进程M2和M5等。我们如何保证在处理M4之前处理M2(通过C2)(通过C1)?

或者我误解了什么?

1 个答案:

答案 0 :(得分:2)

  

我们如何保证在处理M4(由C1)之前处理M2(通过C2)?

一般情况下你不能。

  

如果每个consuemr都绑定到一个分区,那么C1将按顺序处理M1和M4,C2进程M2和M5等。

即使您有一个消费者使用该主题的所有分区,分区也会以不确定的顺序使用,并且不能保证所有分区的总排序。

  

或者我误解了什么?

不,你正确理解。仅在单个分区上保证排序。

作为Vishal John writes

  

例如,假设您的邮件是基于user_id进行分区的,并考虑4条包含user_ids 1,2,3和4的邮件。假设您有一个包含4个分区的“用户”主题。

     

由于分区基于user_id,假设具有user_id 1的消息将转到分区1,具有user_id 2的消息将转到分区2,依此类推..

     

同时假设您有4个消费者参与该主题。由于您有4个消费者,Kafka会将每个消费者分配到一个分区。因此,在这种情况下,只要推送4条消息,消费者就会立即使用它们。

您可以实现缓冲和重新排序的消费者逻辑,但该逻辑的工作方式取决于您的具体用例。

另请参阅:https://stackoverflow.com/a/39593834/741970