Apache kafka 卡夫卡:在卡夫卡中,同一个键(字符串)可以解析为多个分区吗?

Apache kafka 卡夫卡:在卡夫卡中,同一个键(字符串)可以解析为多个分区吗?,apache-kafka,kafka-producer-api,Apache Kafka,Kafka Producer Api,在Kafka中创建producer record时,我们从应用程序读取传入记录,并使用用户ID(作为字符串)作为producer record的键。应用程序每天处理数千个用户Id 我们注意到,具有相同密钥的记录(Z32384910042467345-0)在大多数情况下被发送到同一分区(分区2),但有时被发送到分区1和0。考虑到我们不使用CustomPartitioner,这在Kafka中可能吗?我查看了源代码,他们对key%partition count进行哈希运算,以得到分区,但不明白为什么同

在Kafka中创建producer record时,我们从应用程序读取传入记录,并使用用户ID(作为字符串)作为producer record的键。应用程序每天处理数千个用户Id

我们注意到,具有相同密钥的记录(Z32384910042467345-0)在大多数情况下被发送到同一分区(分区2),但有时被发送到分区1和0。考虑到我们不使用CustomPartitioner,这在Kafka中可能吗?我查看了源代码,他们对key%partition count进行哈希运算,以得到分区,但不明白为什么同一个键映射到不同的分区

另外,还查看了源数据(包含用户ID)中的任何异常,但没有找到任何东西

if (partitionKey != null && partitionKey.length() > 0){
        kafkaProps = kafkaConfigService.getProps(kafkaConfigService.getKafkaMode());
        record = new ProducerRecord(topicName, partitionKey, data);
    } else {
        LOG.error("partitionKey is null. Choosing a random partition");
        kafkaProps = kafkaConfigService.getProps(kafkaConfigService.getKafkaMode());
        record = new ProducerRecord(topicName, data);
    }

这不应该发生。键到分区的映射保持一致。您是否动态添加了分区?@IndraneelBende否。我没有。您是否可以添加上面完整的代码片段?如何获取分区密钥?什么是数据?它是java对象的字符串表示还是其他形式?在上面的示例中,什么是Kafkapprops?1)如果您从外部系统接收密钥,请检查您的密钥是否已被清除,以保留空格等。2)如果您负担得起,请记录密钥、分区ID和分区总数。这可以帮助您验证分区总数是否保持不变即使某些分区由于某种原因暂时不可用,哈希也不会改变。因此,必须是一个代码问题,而不是卡夫卡问题。