【问题标题】:Partition selection in KafkaKafka中的分区选择
【发布时间】:2020-03-18 14:45:38
【问题描述】:

我很好奇如果我有主题 A 和 B,它们具有相同数量的分区,如果我将带有键 x 的消息发送到主题 A,它会转到分区 0 让我们说。当我对主题 B 使用完全相同的键但它们是独立的时,在主题 B 中的键 x 中,在 kafka 流过程中消息是否仍会转到主题 B 上的分区?

【问题讨论】:

    标签: apache-kafka apache-kafka-streams kafka-partition


    【解决方案1】:

    默认情况下,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 是主题的分区数。

    现在来回答您的问题,只要分区的序列化键相同且不为空,那么两条消息将被放置到同一个分区(假设两个主题具有相同的分区)。

    【讨论】:

    • 是的,我想是的!非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 2020-01-25
    相关资源
    最近更新 更多