web-dev-qa-db-fra.com

Comment écrire pour les consommateurs de Kafka - thread unique vs multi thread

J'ai écrit un seul consommateur Kafka (utilisant Spring Kafka), qui lit un seul sujet et fait partie d'un groupe de consommateurs. Une fois qu'un message est utilisé, il effectuera toutes les opérations en aval et passera au décalage de message suivant. Je l'ai présenté sous forme de fichier WAR et mon pipeline de déploiement l'exporte vers une instance unique. À l'aide de mon pipeline de déploiement, je pourrais potentiellement déployer cet artefact sur plusieurs instances de mon pool de déploiement.

Cependant, je ne suis pas capable de comprendre ce qui suit, quand je veux plusieurs consommateurs dans le cadre de mon infrastructure - 

  • Je peux réellement définir plusieurs instances dans mon pool de déploiement et Faire exécuter ce fichier WAR sur toutes ces instances. Cela signifie que tous Écoutent le même sujet, font partie du même groupe de consommateursgroup et diviseront les partitions entre eux. La logique aval Fonctionnera telle quelle. Cela fonctionne parfaitement pour mon cas d'utilisation Cependant, je ne suis pas sûr s'il s'agit de l'approche optimale pour Suivre?

  • En lisant en ligne, je suis tombé sur des ressources ici et ici , Où les gens définissent un seul thread consommateur, mais en interne, Créant plusieurs threads de travail. Il existe également des exemples dans lesquels Pourrait définir plusieurs threads consommateurs faisant la logique en aval En réfléchissant à ces approches et en les mappant aux environnements de déploiement , Nous pourrions obtenir le même résultat (comme mon théorique la solution ci-dessus pourrait), mais avec moins de machines.

Personnellement, je pense que ma solution est simple, évolutive mais peut ne pas être optimale, alors que la deuxième approche pourrait être optimale, mais je voulais connaître vos expériences, suggestions ou tout autre paramètre/contrainte que je devrais prendre en compte? De plus, je pense qu'avec ma solution théorique, je pourrais réellement utiliser des machines simples et simples comme des consommateurs Kafka.

Bien que je sache, je n’ai pas encore posté de code, merci de me prévenir si j’ai besoin de déplacer cette question vers un autre forum. Si vous avez besoin d’exemples de code spécifiques, je peux également les fournir, mais je ne pensais pas qu’ils étaient importants, dans le contexte de ma question.

4
user3842182

Votre solution existante est la meilleure. Passer à un autre thread posera des problèmes de gestion des décalages. Spring kafka vous permet d'exécuter plusieurs threads dans chaque instance, à condition de disposer de suffisamment de partitions.

4
Gary Russell

Si votre approche actuelle fonctionne, restez-y. C'est la manière simple et élégante d'aller.

Vous ne voudriez vous rapprocher de 2 que si, pour une raison quelconque, vous ne pouvez pas augmenter le nombre de partitions, mais que vous avez besoin d'un niveau de parallélisme plus élevé. Mais vous devez vous préoccuper des conditions de commande et de compétition. Si jamais vous deviez emprunter cette voie, je vous recommanderais la bibliothèque akka-stream-kafka , qui fournit des fonctions permettant de gérer correctement les commits offset, de faire ce dont vous avez besoin en parallèle, puis de les fusionner de nouveau en préservant la commande originale, etc. Sinon, ces choses sont sujettes aux erreurs.

0
Michal Borowiecki