【问题标题】:Kafka Partition ordering guaranteeKafka Partition 订购保证
【发布时间】:2019-04-28 15:24:56
【问题描述】:
我确实意识到在 Kafka 中可以确保按分区进行排序。但是当有多个分区并且生产者没有指定键,而只有1个消费者时,分区会受到怎样的影响(为什么有1个消费者?对于当前的数据加载1很好,有多个分区以备将来使用)
20 partitions
1 consumer
No key specified when producing.
1)会影响排序吗?
2)消费者是否会依次从分区0,1..20读取数据?
3) 即使我们指定了分区键,我们也可以保证我们会拥有
就地订购? (哈希冲突的情况除外)
【问题讨论】:
标签:
apache-kafka
kafka-consumer-api
【解决方案1】:
如果没有在producer端定义key,kafka每次都会在每个partition中生成一条消息。循环生产数据 [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。