【发布时间】:2018-10-14 07:54:54
【问题描述】:
我正在尝试调试一个问题,我试图证明如果集群没有重新平衡,每个不同的键只会进入 1 个分区。
所以我想知道对于给定的主题,有没有办法确定密钥发送到哪个分区?
【问题讨论】:
标签: apache-kafka kafka-consumer-api
我正在尝试调试一个问题,我试图证明如果集群没有重新平衡,每个不同的键只会进入 1 个分区。
所以我想知道对于给定的主题,有没有办法确定密钥发送到哪个分区?
【问题讨论】:
标签: apache-kafka kafka-consumer-api
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个分区
这不是保证。哈希可能会发生冲突。
说一个给定的键不在多个分区中更有意义。
如果集群没有重新平衡
重新平衡仍将保留分区值。
【讨论】:
当您发送消息时, 分区由以下类确定
如果你想改变逻辑,实现 org.apache.kafka.clients.producer.Partitioner 接口, 设置ProduceConfig的'partitioner.class'
参考文件: https://kafka.apache.org/documentation/#producerconfigs
【讨论】: