-
Si un numéro de partition valide est spécifié, cette partition sera utilisée lors de l'envoi de l'enregistrement.
-
Si aucune partition n'est spécifiée mais qu'une clé est présente, une partition sera choisie en utilisant un hachage de la clé ( DefaultPartitioner
- voir ci-dessous pour plus de détails).
-
Si aucune clé ni partition n'est présente, une partition sera attribuée de manière circulaire.
Kafka utilise le DefaultPartitioner
( org.apache.kafka.clients.producer.internals.DefaultPartitioner
) afin de répartir les messages entre les partitions de sujets :
/**
* Compute the partition for the given record.
*
* @param topic The topic name
* @param key The key to partition on (or null if no key)
* @param keyBytes serialized key to partition on (or null if no key)
* @param value The value to partition on or null
* @param valueBytes serialized value to partition on or null
* @param cluster The current cluster metadata
*/
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
if (keyBytes == null) {
return stickyPartitionCache.partition(topic, cluster);
}
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
int numPartitions = partitions.size();
// hash the keyBytes to choose a partition
return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
}
Essentiellement, le DefaultPartitioner
fait usage de MurmurHash Une fonction de hachage non cryptographique, généralement utilisée pour la recherche par hachage. Ce hachage est ensuite utilisé dans une opération modulo ( % numPartitions
) afin de s'assurer que la partition renvoyée se situe dans l'intervalle [0, N]
donde N
est le nombre de partitions du sujet.