En plus de la réponse acceptée très utile, je voudrais ajouter quelques détails supplémentaires
Partitionnement
Par défaut, Kafka utilise la clé du message pour sélectionner la partition du sujet dans lequel il écrit. Ceci est fait par quelque chose comme
hash(key) % number_of_partitions
S'il n'y a pas de clé fournie, Kafka partitionnera les données de manière aléatoire de manière circulaire.
Commande
Comme indiqué dans la réponse donnée, Kafka a des garanties sur la commande des messages uniquement au niveau de la partition.
Supposons que vous souhaitiez stocker les transactions financières de vos clients dans une rubrique Kafka avec deux partitions. Les messages pourraient ressembler à (clé: valeur)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
Comme nous n'avons pas défini de clé, les deux partitions ressembleront probablement à
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
Votre consommateur lisant ce sujet pourrait finir par vous dire que le solde du compte est de 600 à un moment donné bien que cela n'ait jamais été le cas! Simplement parce qu'il lisait tous les messages de la partition 0 avant les messages de la partition 1.
Avec une clé sensée (comme customerId), cela pourrait être évité car le partitionnement serait comme ceci:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
Compactage du journal
Sans clé dans vos messages, vous ne pourrez pas définir la configuration du sujet cleanup.policy
sur compacted
. Selon la documentation, "le compactage du journal garantit que Kafka conservera toujours au moins la dernière valeur connue pour chaque clé de message dans le journal des données pour une seule partition de rubrique".
Ce paramètre agréable et utile ne sera pas disponible sans aucune clé.
Utilisation des clés
Dans des cas d'utilisation réels, la clé d'un message Kafka peut avoir une énorme influence sur vos performances et la clarté de votre logique métier.
Une clé peut par exemple être utilisée naturellement pour partitionner vos données. Comme vous pouvez contrôler vos consommateurs pour lire à partir de partitions particulières, cela pourrait servir de filtre efficace. En outre, la clé peut inclure des métadonnées sur la valeur réelle du message qui vous aident à contrôler le traitement ultérieur. Les clés sont généralement plus petites que les valeurs et il est donc plus pratique d'analyser une clé au lieu de la valeur entière. En même temps, vous pouvez appliquer toutes les sérialisations et l'enregistrement de schéma comme cela a été fait avec votre valeur également avec la clé.
A noter, il existe également le concept d'en- tête qui peut être utilisé pour stocker des informations, voir documentation .