Kafka:如果保留每个分区的顺序,在啥情况下主题的消息会乱序

Posted

技术标签:

【中文标题】Kafka:如果保留每个分区的顺序,在啥情况下主题的消息会乱序【英文标题】:Kafka: In what situation will message for a topic be out of order, if order for each partition is preservedKafka:如果保留每个分区的顺序,在什么情况下主题的消息会乱序 【发布时间】:2019-11-26 05:21:24 【问题描述】:

文章“Kafka in a Nutshell”(https://sookocheff.com/post/kafka/kafka-in-a-nutshell/)的作者指出:

Kafka 对数据一致性和可用性做出以下保证:(1) 发送到主题分区的消息将按照发送顺序附加到提交日志中,(2) 单个消费者实例将按顺序查看消息它们出现在日志中,(3) 当所有同步副本都将消息应用到它们的日志时,一条消息被“提交”,并且 (4) 任何提交的消息都不会丢失,只要至少有一个同步副本处于活动状态.

第一个和第二个保证确保为每个分区保留消息顺序。请注意,不能保证整个主题的消息顺序。 ...

我很好奇作者说的是什么意思:

请注意,不能保证整个主题的消息顺序。

【问题讨论】:

如果一个主题有多个消费者,一个可以比另一个更快地处理消息,因此将更早处理其分区中的后续消息。 【参考方案1】:

Kafka 主题由多个分区组成,其中消息根据键散列或分区规则(随机、循环、自定义等)附加到每个分区

主题分区基本上通过跨分区分发消息来并行化进程

因此 Kafka 保证每个分区的顺序,但是由于消息是跨分区分布的,我们不能保证全局或每个主题的顺序

如上图生产者向主题发布消息,但它被顺序附加到任何分区,因此

E.g. assume partition selection is a round-robin

    message 1 -> publish to p1 in position 1
    message 2 -> publish to p2 in position 1
    message 3 -> publish to p2 in position 3
    message 4 -> publish to p1 in position 2
    message 5 -> publish to p2 in position 2

等等 因此消费者可以消费消息,但不能与生产者处于相同的顺序。

如果你想要一个全局排序,你只需要 1 个分区。

【讨论】:

感谢您的解释。但是,我的理解是每条消息都将跨分区复制。所以在你上面的例子中,message 1 -> publish to p1 in position 1 之后,消息 1 将被复制到 p2 和 p3。只有在那之后才会发生message 2 -> publish to p2...。我假设消息 2 必须在复制之后发布,因为如果不是这样,那么 p2 中的顺序也不能保证。 复制不是跨分区而是跨代理...意味着 p1 复制到代理 2 中的 p1。 谢谢。我以前混合了分区和复制。现在我明白了,每个主题可能会被拆分成多个分区,每个分区都会被复制。

以上是关于Kafka:如果保留每个分区的顺序,在啥情况下主题的消息会乱序的主要内容,如果未能解决你的问题,请参考以下文章

Kafka的顺序保证序列化及分区

Kafka-文件管理

具有多个分区的 Apache Kafka 消息顺序

kafka总结

主题、分区和键

读书-kafka