文章“坚果壳中的卡夫卡”(位于https://sookocheff.com/post/kafka/kafka-in-a-nutshell/)的作者指出:
Kafka对数据的一致性和可用性做出以下保证:(1)发送到主题分区的消息将按照它们发送的顺序添加到提交日志中;(2)单个使用者实例将按照该顺序查看消息它们出现在日志中;(3)当所有同步副本都将消息应用到其日志时,“已提交”消息;(4)只要至少有一个同步副本处于活动状态,任何提交的消息都不会丢失。
第一和第二保证确保为每个分区保留消息顺序。请注意,不能保证整个主题的消息顺序。 ...
我很好奇作者说的话:
请注意,不能保证整个主题的消息顺序。
答案 0 :(得分:1)
Kafka主题由多个分区组成,其中,消息根据密钥哈希或分区规则(随机,循环,自定义等)附加到每个分区
主题分区基本上是通过跨分区分配消息来并行化过程
因此,Kafka保证每个分区上的顺序,但是由于消息在整个分区上分布,因此我们无法保证全局或每个主题的顺序
如上图所示,生产者将消息发布到主题,但是因此被顺序地附加到任何分区上
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
,依此类推 因此,消费者可以消费消息,但不能与生产者以相同的顺序进行购买。
如果要进行全局排序,则只需要一个分区。