Nag*_*Nag 4 apache-kafka kafka-producer-api
在阅读卡夫卡权威指南时,我遇到了这句话
当key为空并且使用默认分区器时,记录将被随机发送到主题的可用分区之一。将使用循环算法来平衡分区之间的消息。
这是否意味着这仅适用于使用默认分区程序 ?
如果指定了有效的分区号,则发送记录时将使用该分区。
如果未指定分区但存在密钥,则将使用密钥的哈希值来选择分区(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
| 归档时间: |
|
| 查看次数: |
5388 次 |
| 最近记录: |