apache-kafka - Kafka中的分区选择

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

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

最佳答案

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

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

关于apache-kafka - Kafka中的分区选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58995751/

相关文章:

node.js - 带有 pm2 集群的 Nodejs Kafka 消费者

python - 将 CSV 从 Kafka 发送到 Spark Streaming

apache-kafka-streams - 卡夫卡流 DSL : Aggregating a KStream to a GlobalKTable

java - 是否可以使用key和partition来消费kafka消息?

apache-kafka - Kafka 分区的大小以及写入没有可用磁盘空间的主题

python - 如何从 minikube 上的容器内到达 kafka?

apache-kafka - 使用 Prometheus job-name/target-groups 指定端口范围

apache-kafka - Kafka Streams线程号

java - Kafka Streams App - 计数和总和

apache-kafka - 为多个分区使用kafka批处理