在Kafka中生产前获取记录的分区号

Get the partition number of a record before producing in Kafka

我需要知道一条Kafka记录所在的Kafka主题分区号。

执行前

producer.send(record); 

有什么方法可以知道记录到哪个分区?

据我所知,使用默认的循环分区程序是不可能的。如果您指定一个密钥,您可以从 Producer 源代码中获取默认算法并尝试预测(有点 hash(key) % num.partitions) 如果您使用自定义分区程序,您会处理它并且已经知道。 我想知道 ProducerInterceptor,但它会在分配分区之前提供信息,正如您从文档中看到的那样。

https://kafka.apache.org/26/javadoc/org/apache/kafka/clients/producer/ProducerInterceptor.html

我在这里看到三个选项:

  • 或者您在 ProducerRecord 中指定分区,如 ProducerRecord class
  • 的构造函数所示
  • 定义自定义分区程序,如另一个
  • 所示
  • 利用名为 DescribeTopicsResultAdminClient API 获取有关特定主题的分区数的信息,然后重新应用 Kafka 使用的默认分区程序逻辑:
kafka.common.utils.Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;