在阅读kafka definitve指南时,我碰到了这个短语
当键为null且使用默认分区程序时,记录 将被发送到该主题的可用分区之一 随机。循环算法将用于平衡消息 在分区之间。
这是否仅适用于使用默认分区程序?
答案 0 :(得分:2)
如果指定了有效的分区号,则在发送记录时将使用该分区。
如果未指定任何分区但存在一个密钥,则将使用该密钥的哈希值选择一个分区(DefaultPartitioner
-有关更多详细信息,请参见下文)。
如果既没有密钥也没有分区,则将以循环方式分配一个分区
Kafka利用DefaultPartitioner
(org.apache.kafka.clients.producer.internals.DefaultPartitioner
)跨主题分区分发消息:
/**
* Compute the partition for the given record.
*
* @param topic The topic name
* @param key The key to partition on (or null if no key)
* @param keyBytes serialized key to partition on (or null if no key)
* @param value The value to partition on or null
* @param valueBytes serialized value to partition on or null
* @param cluster The current cluster metadata
*/
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
if (keyBytes == null) {
return stickyPartitionCache.partition(topic, cluster);
}
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
int numPartitions = partitions.size();
// hash the keyBytes to choose a partition
return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
}
基本上,DefaultPartitioner
使用 MurmurHash ,这是一种非加密的哈希函数,通常用于基于哈希的查找。然后,此散列用于模运算(% numPartitions
)中,以确保返回的分区在[0, N]
范围内,其中N
是主题的分区数。
答案 1 :(得分:0)
好吧,不,您可以实现一个自定义分区程序来处理null
键。但是没有消息键,您的自定义分区程序的行为应类似于默认分区程序(即使使用简单的随机算法)。
否则,如何区分发送消息的正确分区?
作为 soft 规则,如果未提供任何密钥,则坚持使用默认分区程序。
关于Kafka custom partitioner的好文档。