Protocols & Binary Serialization

Calcul de partition Kafkaà partir des octets de la clé

Renseignez une clé et le nombre total de partitions pour examiner le routage Murmur2 compatible Java.

Calcul de partition Kafka

Clé sérialisée

Espaces et retours à la ligne sont conservés. Une clé de zéro octet est valide ; choisissez null si la clé est absente.

Résultat

Partition (à partir de 0)
9
Nombre d’octets
5
Hash signé sur 32 bits
2132663229
Hash non signé sur 32 bits
2132663229
Hash sans bit de signe
2132663229

Étapes du calcul

  1. Décoder la clé en 5 octets.
  2. Murmur2 avec la graine 0x9747b28c → 2132663229.
  3. 2132663229 & 0x7fffffff → 2132663229.
  4. 2132663229 % 12 → partition 9.

Octets de la clé en hexadécimal

68 65 6c 6c 6f

Le calcul reste dans cet onglet. Aucune clé n’est envoyée ou enregistrée, et aucun cluster Kafka n’est contacté.

Options

Valable pour le routage par clé Murmur2 compatible Java. Une partition explicite, des clés ignorées, un autre sérialiseur ou partitionneur peuvent modifier la destination réelle.

Calcul terminé.

Un identifiant client arrive dans une partition inattendue alors que son affichage semble correct. Le Calcul de partition Kafka permet de vérifier ce qui précède le routage : les octets produits par la sérialisation, le hachage et le diviseur réellement utilisé.

Une clé de partition numérique peut être encodée en binaire ou en texte. Ces deux représentations ne produisent pas les mêmes octets. Pour reproduire un sérialiseur autre que celui des chaînes UTF-8, utilisez sa sortie exacte en hexadécimal ou en Base64.

Pourquoi utiliser le Calcul de partition Kafka ?

Comparer les octets effectivement hachés

Le Calcul de partition Kafka rapproche trois formes de saisie d’une même séquence d’octets. Un retour à la ligne ajouté lors d’une copie, un espace final ou un caractère multioctet deviennent visibles en hexadécimal. À octets identiques, changer de format d’entrée ne change pas le hash.

Trois canaux d’entrée rejoignent des blocs d’octets identiques puis un résultat commun.

Ne pas confondre vide et absent

Une chaîne UTF-8 vide donne un tableau de zéro octet, donc une entrée valide pour le hachage. Une clé null n’a pas de tableau. Sa destination dépend de l’état du producteur ; le résultat l’indique sans lui attribuer artificiellement la partition zéro.

Une clé en octets suit un trajet fixe ; une clé absente mène à plusieurs destinations possibles en pointillé.

Reproduire les conditions d’envoi

01

Partir de la sortie du sérialiseur

Le texte UTF-8 conserve espaces et retours à la ligne. L’hexadécimal accepte les blancs ASCII, mais exige des paires complètes sans 0x. Le Base64 standard exige son remplissage. Changer l’encodage réinterprète la saisie existante, sans la convertir.

02

Vérifier le nombre total actuel

La valeur initiale 12 est un exemple, pas un conseil de dimensionnement. Les numéros vont de 0 à 11 dans ce cas. Modifier le total peut changer le reste de la division, donc la destination des prochains messages, sans changer le hash.

03

Contrôler le masque avec un vecteur

Chargez abc ou foobar pour comparer le hash signé à la référence affichée. Le calcul automatique attend 350 ms après la dernière modification. Désactivez-le pour utiliser Ctrl/Cmd + Entrée. Le rapport reste inaccessible tant que le résultat est périmé.

Une trace complète du routage

La variante fixe utilisée par Kafka

Murmur2 utilise la graine 0x9747b28c, des blocs de quatre octets en petit-boutiste et des produits sur 32 bits. Les vues signée et non signée décrivent les mêmes bits. Le routage efface le bit de signe avec 0x7fffffff avant le modulo ; une valeur absolue donnerait parfois un autre résultat.

Des encodages vérifiés strictement

Hex et Base64 standard permettent de fournir toute valeur, notamment 00 et ff. Un nombre impair de chiffres, un remplissage incorrect ou des bits finaux non canoniques sont refusés. Aucune correction silencieuse du texte, de sa casse ou de sa forme Unicode ne modifie les octets.

Références fixes et export intégral

Le panneau propose abc, foobar et 21 avec les valeurs attendues d’Apache Kafka. La vue commence à 100 octets et s’étend par tranches de 100. Le JSON contient la totalité des octets, l’algorithme, l’encodage, le type de clé, le nombre de partitions et les valeurs intermédiaires.

Périmètre et conditions de validité

Un algorithme, pas tous les clients
Seul Murmur2 compatible Java est implémenté. Le défaut de librdkafka peut être fondé sur CRC32. Un partitionneur personnalisé, partitioner.ignore.keys ou une partition imposée peuvent contourner cette formule. CRC32, Murmur3, FNV et les graines personnalisées ne sont pas proposés.
Aucune prédiction fixe pour null
Le mode null conserve le texte mais l’ignore. Les stratégies sticky ou aléatoires nécessitent un état d’exécution qui n’est pas disponible ici. En mode octets, le texte littéral null reste une clé UTF-8 de quatre octets. Certains clients traitent aussi les clés vides différemment.
La sérialisation doit être fournie
L’outil n’exécute ni Avro, ni Protobuf, ni sérialiseur d’entiers et ne consulte pas de schema registry. Il ne supprime pas les espaces et ne normalise pas Unicode. Un surrogate isolé est rejeté afin d’éviter une substitution automatique par le navigateur.
Des limites locales explicites
La limite est de 196608 unités de code UTF-16 et de 65536 octets après décodage. Le total doit être un entier décimal de 1 à 2147483647. Il n’y a pas d’import de fichier, d’URL ou de lot. Ces limites ne décrivent pas la taille maximale d’un message Kafka.
Ni capacité ni déplacement des messages
Une clé isolée ne permet pas de recommander un nombre de partitions ni de déterminer broker, consommateur ou offset. Une augmentation du total peut modifier les futures destinations sans déplacer les anciens messages. La distribution globale et l’ordre entre partitions ne sont pas garantis.

Calcul de partition Kafka : questions fréquentes

Comment déterminer la partition de destination d'une clé ?

Pour le routage sélectionné, appliquez Murmur2 aux octets sérialisés, effacez le bit de signe puis prenez le reste modulo le total des partitions. Par exemple, abc donne 479470107 et aboutit à la partition 3 sur 12. Confirmez le total avec les métadonnées du topic.

Des clés différentes peuvent-elles aboutir à la même partition ?

Oui. De très nombreuses clés se répartissent entre un nombre fini de destinations. Deux hashes différents peuvent donner le même reste : ce n’est donc pas nécessairement une collision du hash complet. Une destination commune ne prouve pas que les clés sont identiques.

Pourquoi une même clé arrive-t-elle dans des partitions différentes ?

Comparez les octets, le nombre total et la configuration du partitionneur. Deux clients peuvent employer des algorithmes ou des sérialiseurs différents. Une partition explicite et l’option d’ignorer les clés peuvent aussi intervenir. Le rééquilibrage des consommateurs ne modifie pas cette formule de hachage.

Faut-il fournir une clé pour envoyer un message Kafka ?

Non. Le besoin d’une clé dépend des exigences de regroupement et d’ordre de l’application. Un producteur peut envoyer sans clé, mais cette formule Murmur2 ne suffit alors pas à déterminer la destination. Une chaîne vide reste différente d’une clé absente.

Comment la partition est-elle choisie sans clé ?

Cela dépend du client, de sa version, de sa configuration et de son état, notamment des lots en cours. Les producteurs Java peuvent utiliser un comportement sticky. L’outil ne donne donc pas de numéro fixe pour null et ne suppose pas systématiquement un ancien comportement circulaire.

La graine Murmur2 change-t-elle à chaque exécution ?

La variante Kafka utilise une graine fixe, 0x9747b28c. À octets identiques, le hash se reproduit d’une exécution à l’autre. La destination peut toutefois changer si le nombre de partitions change, ou si le producteur utilise un partitionneur doté d’une autre règle.

Un résultat ou une erreur semble incorrect ?

Vérifier la prochaine clé

Reprenez le Calcul de partition Kafka avec la sortie réelle du sérialiseur, puis comparez chaque valeur avec l’implémentation de routage du producteur.