Comprendre les rubriques et les partitions Kafka

185

Je commence à apprendre Kafka à des fins de solution d'entreprise.

Au cours de mes lectures, quelques questions me sont venues à l'esprit:

  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?
  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 cluster de consommateurs du même sujet ou de plusieurs sujets qui intéressent ce groupe de consommateurs?
  3. Chaque groupe de consommateurs a-t-il une partition correspondante sur le courtier ou chaque consommateur en a-t-il une?

  4. Les partitions sont-elles créées par le courtier, et donc pas une préoccupation pour les consommateurs?

  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?

  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?

Pinidbest
la source

Réponses:

162

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:

aperçu des composants du producteur

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 inférieur aux partitions de rubrique
  • Nombre de consommateurs identique au nombre de partitions de sujet, puis le mappage de partition et de consommateur peut être comme ci-dessous, nombre de consommateurs égal au nombre de partitions de rubrique
  • 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 nombre de consommateurs supérieur au nombre de partitions de sujet

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.commitsur 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 :

  1. C'est l'un des courtiers élus du cluster côté serveur Kafka.
  2. Les consommateurs interagissent avec le coordinateur de groupe pour les validations de décalage et la récupération des demandes.
  3. 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.resetconfiguration 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.

mrsrinivas
la source
5
Salut ! Je suis l'auteur de la réponse acceptée, mais je pense que la vôtre est vraiment sympa aussi, notamment sur le point numéro 3 où les diagrammes rendent les choses 200% plus claires! Pensez-vous que nous devrions fusionner?
C4stor
Je voulais dire que je (ou vous) pouvais incorporer des éléments de votre réponse dans la mienne, pour leur donner plus de visibilité et améliorer cette réponse (actuellement) en tête. Mais je ne le ferais pas sans votre accord!
C4stor
Pourquoi ne peut pas mapper plusieurs consommateurs à une partition? Pour garantir que le message ne soit traité qu'une seule fois? Thx pour votre réponse.
g10guang
1
@ g10guang: C'est à cause de la difficulté dans la maintenance de l' offset de commit .
mrsrinivas
1
Un autre scénario. Vous pouvez avoir UNE partition et PLUSIEURS consommateurs abonnés / assignés. Le courtier ne remettra les dossiers qu'au premier consommateur inscrit. Mais supposons que le premier consommateur prenne plus de temps pour traiter la tâche que l'intervalle d'interrogation. La consommation record n'est pas engagée auprès du courtier. Le courtier comprend que le consommateur a traîné. Dans cet état, le courtier déclenche un rééquilibrage en envoyant les nouvelles partitions attribuées à tous ses consommateurs. Le message est à nouveau consommé par un autre consommateur même s'il est toujours en cours de traitement par C1. Faites attention.
Ruben Daddario
127

Prenons-les dans l'ordre :)

1 - Lorsqu'un producteur produit un message - Il précisera le sujet auquel il souhaite envoyer le message, n'est-ce pas? Se soucie-t-il des partitions?

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.


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 cluster de consommateurs du même sujet ou de plusieurs sujets qui intéressent ce groupe de consommateurs?

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.


3 - Chaque groupe de consommateurs a-t-il une partition correspondante sur le courtier ou est-ce que chaque consommateur en a une?

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.


4 - Les partitions créées par le courtier ne sont-elles donc pas une préoccupation pour les consommateurs?

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.


5 - Puisqu'il s'agit d'une file d'attente avec un offset 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?

Oui, les consommateurs enregistrent un décalage par sujet par partition. Ceci est totalement géré par Kafka, pas de soucis à ce sujet.


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 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.

C4stor
la source
3
Sry :) C'est un peu difficile d'expliquer tout le processus kafka en 500 cases de caractères, je suggère de lire kafka.apache.org/documentation.html#theconsumer (et probablement le reste de la section 4, sur les internes de kafka). En gros: les consommateurs demandent des économies de compensation, mais celles-ci sont enregistrées ailleurs.
C4stor
Je viens de lire ceci et cela n'explique toujours pas où il se déroule: Kafka gère cela différemment. Notre sujet est divisé en un ensemble de partitions totalement ordonnées, dont chacune est consommée par un consommateur à un moment donné. Cela signifie que la position d'un consommateur dans chaque partition n'est qu'un seul entier, le décalage du prochain message à consommer. Cela rend l'état de ce qui a été consommé très petit, juste un nombre pour chaque partition. Cet état peut être périodiquement contrôlé. Cela rend l'équivalent des accusés de réception de message très bon marché.
Pinidbest
20

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/

ybonda
la source
La partition est-elle uniquement destinée à équilibrer la charge des sujets?
g10guang
1
@ g10guang: les partitions aident également à traiter les messages en parallèle.
mrsrinivas
Veuillez me corriger si je me trompe, quand un message envoyé par un producteur et quand il entre dans le sujet, il le copie sur les partitions selon les configurations et le consommateur le consomme. Droite?
Atul le
1
@Atul, le message sera ajouté à 1 des partitions pour ce sujet en fonction de la configuration actuelle du partitionneur (par défaut, le hachage de la clé de message détermine à quelle partition le message va), et oui, un consommateur prendra le message comme il consomme les messages de cette partition
Kevin Hooke
@Kevin Hooke, merci pour l'explication et pour clarifier ma compréhension.
Atul