Cet article a déjà des réponses, mais j'ajoute ma vue avec quelques photos du guide définitif de Kafka
Avant de répondre à chaque question, ajoutons un aperçu des composants producteurs:
1. Lorsqu'un producteur produit un message - Il spécifie le sujet auquel il souhaite envoyer le message, n'est-ce pas? Se soucie-t-il des partitions?
Le producteur décidera de la partition cible pour placer n'importe quel message, en fonction de:
- ID de partition, s'il est spécifié dans le message
- clé% num partitions , si aucun identifiant de partition n'est mentionné
- Round robin si ni l' ID de partition ni la clé de message ne sont disponibles dans le message, ce qui signifie que seule la valeur est disponible
2. Lorsqu'un abonné est en cours d'exécution - Spécifie-t-il son identifiant de groupe afin qu'il puisse faire partie d'un groupe de consommateurs du même sujet ou de plusieurs sujets qui intéressent ce groupe de consommateurs?
Vous devez toujours configurer group.id, sauf si vous utilisez l'API d'affectation simple et que vous n'avez pas besoin de stocker les décalages dans Kafka. Il ne fera partie d'aucun groupe. la source
3. Chaque groupe de consommateurs a-t-il une partition correspondante sur le courtier ou est-ce que chaque consommateur en a une?
Dans un groupe de consommateurs, chaque partition sera traitée par un seul consommateur . Voici les scénarios possibles
- Le nombre de consommateurs est inférieur au nombre de partitions de rubrique, puis plusieurs partitions peuvent être attribuées à l'un des consommateurs du groupe
- Nombre de consommateurs identique au nombre de partitions de sujet, puis le mappage de partition et de consommateur peut être comme ci-dessous,
- Le nombre de consommateurs est supérieur au nombre de partitions de sujet, puis le mappage de partition et de consommateur peut être comme indiqué ci-dessous, non efficace, vérifiez Consommateur 5
4. Comme les partitions créées par le courtier, donc pas un souci pour les consommateurs?
Le consommateur doit être conscient du nombre de partitions, comme indiqué à la question 3.
5. Puisqu'il s'agit d'une file d'attente avec un décalage pour chaque partition, est-il de la responsabilité du consommateur de spécifier les messages qu'il souhaite lire? A-t-il besoin de sauvegarder son état?
Kafka (pour être un coordinateur de groupe spécifique ) prend en charge l'état du décalage en produisant un message à une rubrique __consumer_offsets interne , ce comportement peut également être configurable en manuel en définissant enable.auto.commit
sur false
. Dans ce cas, consumer.commitSync()
et consumer.commitAsync()
peut être utile pour gérer le décalage.
En savoir plus sur le coordinateur de groupe :
- C'est l'un des courtiers élus du cluster côté serveur Kafka.
- Les consommateurs interagissent avec le coordinateur de groupe pour les validations de décalage et la récupération des demandes.
- Le consommateur envoie des pulsations périodiques au coordinateur de groupe.
6. Que se passe-t-il lorsqu'un message est supprimé de la file d'attente? - Par exemple: la rétention a duré 3 heures, puis le temps passe, comment le décalage est-il géré des deux côtés?
Si un consommateur démarre après la période de rétention, les messages seront consommés selon la auto.offset.reset
configuration qui pourrait l'être latest/earliest
. techniquement, c'est latest
(commencer à traiter les nouveaux messages) car tous les messages ont expiré à ce moment-là et la rétention est la configuration au niveau du sujet.
Prenons-les dans l'ordre :)
Par défaut, le producteur ne se soucie pas du partitionnement. Vous avez la possibilité d'utiliser un partitionneur personnalisé pour avoir un meilleur contrôle, mais c'est totalement facultatif.
Oui, les consommateurs rejoignent (ou créent s'ils sont seuls) un groupe de consommateurs pour partager la charge. Aucun consommateur du même groupe ne recevra jamais le même message.
Ni. Tous les consommateurs d'un groupe de consommateurs se voient attribuer un ensemble de partitions, sous deux conditions: aucun consommateur du même groupe n'a de partition en commun - et le groupe de consommateurs dans son ensemble se voit attribuer chaque partition existante.
Ce n'est pas le cas, mais vous pouvez voir à partir de 3 qu'il est totalement inutile d'avoir plus de consommateurs que de partitions existantes, c'est donc votre niveau de parallélisme maximal pour la consommation.
Oui, les consommateurs enregistrent un décalage par sujet par partition. Ceci est totalement géré par Kafka, pas de soucis à ce sujet.
Si un consommateur demande un décalage non disponible pour une partition sur les courtiers (par exemple, en raison d'une suppression), il entre en mode erreur et se réinitialise finalement pour cette partition sur le message le plus récent ou le plus ancien disponible (selon la valeur de configuration auto.offset.reset) et continuez à travailler.
la source
Kafka utilise la conception de sujets qui vient mettre de l'ordre dans le flux des messages.
Pour équilibrer la charge, un sujet peut être divisé en plusieurs partitions et répliqué entre les courtiers.
Les partitions sont des séquences ordonnées et immuables de messages qui sont continuellement ajoutées, c'est-à-dire un journal de validation.
Les messages de la partition ont un numéro d'identification séquentiel qui identifie de manière unique chaque message de la partition.
Les partitions permettent au journal d'un sujet d'évoluer au-delà d'une taille qui s'adapte sur un seul serveur (un courtier) et agissent comme l'unité de parallélisme.
Les partitions d'un sujet sont réparties sur les courtiers du cluster Kafka où chaque courtier gère les données et les demandes de partage des partitions.
Chaque partition est répliquée sur un nombre configurable de courtiers pour assurer la tolérance aux pannes.
Bien expliqué dans cet article: http://codeflex.co/what-is-apache-kafka/
la source