我很好奇如果我有主题 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/