我确实意识到在Kafka中可以确保按分区订购。但是,当有多个分区且生产者未指定密钥而只有1个使用者时,该分区将受到怎样的影响(为什么有1个使用者?对于当前数据加载1很好,可以有多个分区供将来使用)
20 partitions
1 consumer
No key specified when producing.
1)订购会受到影响吗?
2)消费者是否会依次从分区0,1..20读取数据?
3)即使我们指定了分区键,我们也可以确保 订购到位? (除了哈希冲突的情况除外)
答案 0 :(得分:1)
如果您未在生产方定义密钥,则kafka每次都会在每个分区中生成一条消息。循环产生数据 [code here]。
如果您有2个分区,则为示例:
msg_1 -> partition: 0
msg_2 -> partition: 1
msg_3 -> partition: 0
msg_4 -> partition: 1
这样做的问题是您不能确保在另一端进行排序,因为消耗的消息可以在每个分区的不同时间消耗。想象一下,您在分区0偏移量1中有一条消息,第二条消息在分区1偏移量1中。Kafka使用者可以在进入分区0之前开始使用分区1中的消息。
为避免此问题,请始终对需要订购的消息使用相同的密钥。现在解决此问题的唯一方法是创建一个状态存储并在每次需要阅读文档时检查其状态。
如果设置了密钥,则总是将密钥发送到相同的分区,唯一的不同顺序是在生产者端,但这将成为竞争条件。仅当您有两个生产者同时生产同一密钥时,才会发生订单中断的情况。您可以检查逻辑here。