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

时间:2019-11-26 05:21:24

标签: apache-kafka

文章“坚果壳中的卡夫卡”(位于https://sookocheff.com/post/kafka/kafka-in-a-nutshell/)的作者指出:

  

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

     

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

我很好奇作者说的话:

  

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

1 个答案:

答案 0 :(得分:1)

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

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

因此,Kafka保证每个分区上的顺序,但是由于消息在整个分区上分布,因此我们无法保证全局或每个主题的顺序 enter image description here

如上图所示,生产者将消息发布到主题,但是因此被顺序地附加到任何分区上

E.g. assume partition selection is 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

,依此类推 因此,消费者可以消费消息,但不能与生产者以相同的顺序进行购买。

如果要进行全局排序,则只需要一个分区。

enter image description here