向卡夫卡发布消息的最佳方式是什么?
问题描述:
我有一个卡夫卡生产者,基本上做下面的工作。我有一个至少有10个分区的主题,我不在乎它们消耗的顺序(我的后端将处理它)。我还将启动至少10个消费者(假设每个消费者都紧盯着1个分区)。如果我开始发布邮件(使用下面的代码),kafka会处理负载并将邮件均匀地放在所有分区中,或者我应该引入一个密钥(这对我的应用程序来说真的没有关系)并自行实施轮循机制?向卡夫卡发布消息的最佳方式是什么?
KeyedMessage<String, String> data = new KeyedMessage<>(topic, txt);
producer.send(data);
producer.close();
有什么想法?
答
在默认情况下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;
}
,卡夫卡将平分所有分区
之间的所有消息