Apache kafka 卡夫卡主题分区0未被使用
我创建了一个包含3个分区的主题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
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。您是对的,基于散列的分发并不能保证使用所有分区