Apache kafka 卡夫卡主题分区0未被使用

Apache kafka 卡夫卡主题分区0未被使用,apache-kafka,kafka-consumer-api,kafka-producer-api,Apache Kafka,Kafka Consumer Api,Kafka Producer Api,我创建了一个包含3个分区的主题 Topic:fixtures PartitionCount:3 ReplicationFactor:1 Configs: Topic: fixtures Partition: 0 Leader: 0 Replicas: 0 Isr: 0 Topic: fixtures Partition: 1 Leader: 0 Replicas: 0 Isr: 0 Topic: fixtures Partition: 2

我创建了一个包含3个分区的主题

Topic:fixtures  PartitionCount:3    ReplicationFactor:1 Configs:
    Topic: fixtures Partition: 0    Leader: 0   Replicas: 0 Isr: 0
    Topic: fixtures Partition: 1    Leader: 0   Replicas: 0 Isr: 0
    Topic: fixtures Partition: 2    Leader: 0   Replicas: 0 Isr: 0
我使用Java生产者同步地写入主题

producer.send(new ProducerRecord<>(KafkaProperties.TOPIC_FIXTURES, key, value)).get();
producer.send(新的ProducerRecord(KafkaProperties.TOPIC_FIXTURES,key,value)).get();
我有一个Java用户,它订阅并读取它

Consumer<String, String> kafkaConsumer = new KafkaConsumer<>(configs);
kafkaConsumer.subscribe(Collections.singletonList(KafkaProperties.TOPIC_FIXTURES));
消费者卡夫卡消费者=新卡夫卡消费者(配置);
kafkaConsumer.subscribe(Collections.singletonList(KafkaProperties.TOPIC_FIXTURES));
我的键总是由3个不同的字符串(k1、k2、k3)组成的固定集。但是我的消息总是去分区1或分区2——k1和k2去分区1,k3去分区2

分区0为什么未使用?

对于键控消息,将根据键的哈希值计算分区

对于许多密钥,使用密钥散列是在分区之间均匀分布消息的有效方法

但是如果您只有很少几个不同的键(或者如果键的数量接近分区的数量),那么它可能不会使用所有分区

如果是这种情况,那么您可以使用
partitioner.class
配置向生产者提供您自己的分区器,例如执行循环。

对于键控消息,根据键的散列计算分区

对于许多密钥,使用密钥散列是在分区之间均匀分布消息的有效方法

但是如果您只有很少几个不同的键(或者如果键的数量接近分区的数量),那么它可能不会使用所有分区


如果是这种情况,那么您可以使用
partitioner.class
配置向生产者提供您自己的partitioner,以进行循环。例如,这是一种记录在案且可预测的行为吗?如果可能的话,我希望避免必须重写任何内容并依赖默认行为。谢天谢地,这是一种可预测的行为,因为默认情况下Kafka保证将具有相同密钥的消息写入同一分区。文档中提到这一点的确切原因是分区0没有被使用是因为
Utils.toPositive(Utils.2(keyBytes))%numPartitions
没有为我拥有的3个键中的任何一个返回0。您是对的,基于散列的分发并不能保证所有分区都会被使用,这是一种有文档记录且可预测的行为吗?如果可能的话,我希望避免必须重写任何内容并依赖默认行为。谢天谢地,这是一种可预测的行为,因为默认情况下Kafka保证将具有相同密钥的消息写入同一分区。文档中提到这一点的确切原因是分区0没有被使用是因为
Utils.toPositive(Utils.2(keyBytes))%numPartitions
没有为我拥有的3个键中的任何一个返回0。您是对的,基于散列的分发并不能保证使用所有分区