Apache Kafka - 没有密钥的消息

Nag*_*Nag 4 apache-kafka kafka-producer-api

在阅读卡夫卡权威指南时,我遇到了这句话

当key为空并且使用默认分区器时,记录将被随机发送到主题的可用分区之一。将使用循环算法来平衡分区之间的消息。

这是否意味着这仅适用于使用默认分区程序

Gio*_*ous 5

  • 如果指定了有效的分区号,则发送记录时将使用该分区。

  • 如果未指定分区但存在密钥,则将使用密钥的哈希值来选择分区(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;
}
Run Code Online (Sandbox Code Playgroud)

本质上,它DefaultPartitioner利用MurmurHash,这是一种非加密哈希函数,通常用于基于哈希的查找。然后将该哈希用于模运算 ( % numPartitions),以确保返回的分区在主题分区数的范围[0, N]内。N