我有一个kafka制作人,基本上完成了以下工作。我有一个主题有至少10个分区,我不关心他们消耗的顺序(我的后端将处理它)。我还将启动至少10个消费者(假设每个消费者都坚持1个分区)。如果我开始发布消息(使用下面的代码),kafka将处理负载并将消息均匀地放在所有分区中,或者我应该引入一个密钥(这对我的应用程序真的无关紧要)并自己实现循环法?
KeyedMessage<String, String> data = new KeyedMessage<>(topic, txt);
producer.send(data);
producer.close();
有什么想法吗?
答案 0 :(得分:1)
在默认情况下,将使用org.apache.kafka.clients.producer.internals.DefaultPartitioner
if (keyBytes == null) {
int nextValue = counter.getAndIncrement();
List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);
if (availablePartitions.size() > 0) {
int part = DefaultPartitioner.toPositive(nextValue) % availablePartitions.size();
return availablePartitions.get(part).partition();
} else {
// no partitions are available, give a non-available partition
return DefaultPartitioner.toPositive(nextValue) % numPartitions;
}
} else {
// hash the keyBytes to choose a partition
return DefaultPartitioner.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
}
根据代码,kafka将在所有分区之间平均分割所有消息