我正在尝试调试一个问题,我试图证明如果群集没有重新平衡,每个不同的密钥只会转到1个分区。
所以我想知道一个给定的主题,有没有办法确定一个密钥发送到哪个分区?
答案 0 :(得分:3)
As explained here或also in the source code
您需要byte[] keyBytes
假设它不为空,然后使用org.apache.kafka.common.utils.Utils
,您可以运行以下命令。
Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
对于字符串或JSON,它是UTF8编码的,而Utils类有辅助函数来实现它。
对于Avro,例如Confluent序列化值,它有点复杂(一个神奇的字节,然后一个模式ID,然后是数据)。见Wire format
只进入1分区
这不是保证。哈希可以碰撞。
说一个给定的密钥不在一个以上的分区中更有意义。
如果群集未重新平衡
重新平衡仍将保留分区值。
答案 1 :(得分:0)
分区由以下类确定
如果您想要更改逻辑,请实现org.apache.kafka.clients.producer.Partitioner接口和, 设置ProduceConfig的'partitioner.class'
参考文献: https://kafka.apache.org/documentation/#producerconfigs