3

Quelle est la différence dans le comportement des deux extraits de code ci-dessous pour publier un message?Spring Kafka Partitioning

Approche 1

Message<String> message = MessageBuilder.withPayload("testmsg") 
     .setHeader(KafkaHeaders.MESSAGE_KEY, "key").setHeader(KafkaHeaders.TOPIC, "test").build(); 

ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(message); 

Approche 2

ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send("test", "testmsg"); 

Sujet Config:

$ bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test 
Topic:test PartitionCount:3 ReplicationFactor:1 Configs: 
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0 
Topic: test Partition: 1 Leader: 0 Replicas: 0 Isr: 0 
Topic: test Partition: 2 Leader: 0 Replicas: 0 Isr: 0 

Observation:

S'il y a 3 consommateurs, un par partition; L'approche 1 conduit à tous les messages consommés par un seul consommateur à partir d'une seule partition. Avec l'approche 2; la consommation est également répartie entre les 3 partitions/consommateurs.

Répondre

4

Mais vous avez une réponse dans votre code. Le premier avec le topic fournit messageKey.

Le messageKey est vraiment utilisé pour déterminer la partition cible si non spécifié explicitement:

/** 
* computes partition for given record. 
* if the record has partition returns the value otherwise 
* calls configured partitioner class to compute the partition. 
*/ 
private int partition(ProducerRecord<K, V> record, byte[] serializedKey, byte[] serializedValue, Cluster cluster) { 
    Integer partition = record.partition(); 
    return partition != null ? 
      partition : 
      partitioner.partition(
        record.topic(), record.key(), serializedKey, record.value(), serializedValue, cluster); 
} 

DefaultPartitioner Est-ce:

List<PartitionInfo> partitions = cluster.partitionsForTopic(topic); 
int numPartitions = partitions.size(); 
if (keyBytes == null) { 
    int nextValue = nextValue(topic); 
     ... 
} else { 
    // hash the keyBytes to choose a partition 
    return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions; 
} 

Ainsi, tous les messages avec le même key sont envoyés la même partition. Sinon, ils sont placés sur le thème round robin.