2016-04-26 24 views
0

Ich habe einen Kafka-Produzenten, der im Grunde die folgenden Arbeiten macht. Ich habe ein Thema mit mindestens 10 Partitionen und ich interessiere mich nicht für die Reihenfolge, die sie verbraucht haben (mein Backend wird damit umgehen). Ich werde auch mindestens 10 Konsumenten starten (vorausgesetzt, dass jeder auf 1 Partition klammert). Wenn ich mit dem Veröffentlichen von Nachrichten (unter Verwendung von Code) anfange, wird Kafka die Last handhaben und die Nachrichten gleichmäßig auf alle Partitionen verteilen oder sollte ich einen Schlüssel einführen (was wirklich keine Rolle spielt) und Round-Robin selbst implementieren?Was ist der beste Weg, Nachrichten an Kafka zu veröffentlichen?

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

Irgendwelche Gedanken?

Antwort

1

Im Standardfall wird 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

gemäß dem Code verwendet werden, werden alle Meldungen kafka gleichmäßig zwischen allen Partitionen aufgeteilt