向kafka发布消息的最佳方式是什么?

时间:2016-04-26 16:46:07

标签: apache-kafka round-robin kafka-producer-api

我有一个kafka制作人,基本上完成了以下工作。我有一个主题有至少10个分区,我不关心他们消耗的顺序(我的后端将处理它)。我还将启动至少10个消费者(假设每个消费者都坚持1个分区)。如果我开始发布消息(使用下面的代码),kafka将处理负载并将消息均匀地放在所有分区中,或者我应该引入一个密钥(这对我的应用程序真的无关紧要)并自己实现循环法?

KeyedMessage<String, String> data = new KeyedMessage<>(topic, txt);
producer.send(data);
producer.close();

有什么想法吗?

1 个答案:

答案 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;
    }

link to source code

根据代码,kafka将在所有分区之间平均分割所有消息