2016-04-26 178 views
0

我有一个卡夫卡生产者,基本上做下面的工作。我有一个至少有10个分区的主题,我不在乎它们消耗的顺序(我的后端将处理它)。我还将启动至少10个消费者(假设每个消费者都紧盯着1个分区)。如果我开始发布邮件(使用下面的代码),kafka会处理负载并将邮件均匀地放在所有分区中,或者我应该引入一个密钥(这对我的应用程序来说真的没有关系)并自行实施轮循机制?向卡夫卡发布消息的最佳方式是什么?

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

有什么想法?

回答

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

,卡夫卡将平分所有分区

之间的所有消息
相关问题