Pourquoi les consommateurs de Kafka se connectent-ils à zookeeper et les producteurs obtiennent-ils des métadonnées auprès des courtiers?
Pourquoi les consommateurs se connectent - ils à zookeeper pour récupérer les emplacements de partition? Et les producteurs de kafka doivent se connecter à l'un des courtiers pour récupérer les métadonnées.
Mon point est, Quelle est exactement l'utilisation de zookeeper lorsque chaque courtier a déjà toutes les métadonnées nécessaires pour dire aux producteurs l'emplacement pour envoyer leurs messages? Les courtiers ne pourraient-ils pas envoyer ces mêmes informations aux consommateurs?
Je peux comprendre pourquoi les courtiers ont les métadonnées, pour ne pas avoir à faire un connexion à zookeeper chaque fois qu'un nouveau message est envoyé. Y a-t-il une fonction que zookeeper a que je manque? Je trouve difficile de penser à une raison pour laquelle zookeeper est vraiment nécessaire dans un cluster kafka.
2 réponses
Tout d'abord, zookeeper est nécessaire uniquement pour les consommateurs de haut niveau. SimpleConsumer
ne nécessite pas le travail de zookeeper.
La principale raison pour laquelle zookeeper est nécessaire pour un consommateur de haut niveau est de suivre les décalages consommés et de gérer l'équilibrage de charge.
Maintenant plus en détail.
En ce qui concerne le suivi offset, imaginez le scénario suivant: vous démarrez un consommateur, consommez 100 messages et fermez le consommateur. La prochaine fois que vous démarrez votre consommateur vous voudrez probablement reprendre à partir de votre dernière consommation offset (qui est 100), et cela signifie que vous devez stocker le décalage maximum consommé quelque part. Voici où zookeeper entre en jeu: il stocke les décalages pour chaque groupe / sujet / partition. Donc, de cette façon, la prochaine fois que vous démarrez votre consommateur, il peut demander " hey zookeeper, Quel est le décalage que je devrais commencer à consommer?". Kafka est en train de pouvoir stocker des décalages non seulement dans zookeeper, mais aussi dans d'autres stockages (pour l'instant, seuls les stockages zookeeper
et kafka
sont disponibles et je ne suis pas sûr kafka
le stockage est entièrement implémenté).
En ce qui concerne l'équilibrage de charge, la quantité de messages produits peut être assez importante pour être traitée par 1 machine et vous voudrez probablement ajouter de la puissance de calcul à un moment donné. Disons que vous avez un sujet avec 100 partitions et pour gérer cette quantité de messages, Vous avez 10 machines. Il y a plusieurs questions qui se posent ici en fait:
- comment ces 10 machines devraient-elles diviser les partitions entre elles?
- Que se passe-t-il si l'un des les machines meurent?
- Que se passe-t-il si vous souhaitez ajouter une autre machine?
Et encore une fois, voici où Zookeeper entre en jeu: il suit tous les consommateurs du groupe et chaque consommateur de haut niveau est abonné aux changements dans ce groupe. Le fait est que lorsqu'un consommateur apparaît ou disparaît, zookeeper avertit tous les consommateurs et déclenche un rééquilibrage afin qu'ils divisent les partitions de manière presque égale (par exemple pour équilibrer la charge). De cette façon il garantit si l'un des consommateurs meurt d'autres continueront le traitement partitions qui appartenaient à ce consommateur.
Avec kafka 0.9+, la nouvelle API grand public a été introduite. Les nouveaux consommateurs n'ont pas besoin de connexion à Zookeeper puisque l'équilibrage de groupe est fourni par kafka lui-même.