Apache Kafka-没有密钥的消息

时间:2020-06-05 08:04:06

标签: apache-kafka kafka-producer-api

在阅读kafka definitve指南时,我碰到了这个短语

当键为null且使用默认分区程序时,记录 将被发送到该主题的可用分区之一 随机。循环算法将用于平衡消息 在分区之间。

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

2 个答案:

答案 0 :(得分:2)

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

  • 如果未指定任何分区但存在一个密钥,则将使用该密钥的哈希值选择一个分区(DefaultPartitioner-有关更多详细信息,请参见下文)。

  • 如果既没有密钥也没有分区,则将以循环方式分配一个分区


Kafka利用DefaultPartitionerorg.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的好文档。