在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
的构造函数所示
- 定义自定义分区程序,如另一个
所示
- 利用名为 DescribeTopicsResult 的
AdminClient
API 获取有关特定主题的分区数的信息,然后重新应用 Kafka 使用的默认分区程序逻辑:
kafka.common.utils.Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
我需要知道一条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 的构造函数所示
- 定义自定义分区程序,如另一个
- 利用名为 DescribeTopicsResult 的
AdminClient
API 获取有关特定主题的分区数的信息,然后重新应用 Kafka 使用的默认分区程序逻辑:
kafka.common.utils.Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;