web-dev-qa-db-fra.com

Comment comptez-t-il Kafka consommateur consommer de plusieurs partitions assignées

TL; DR; J'essaie de comprendre comment un consommateur unique qui est attribué plusieurs partitions gère des enregistrements consommateurs de la partition de portée.

Par exemple:

  • Processue complètement une seule partition avant de passer à la suivante.
  • Traiter une partie des enregistrements disponibles de chaque partition à chaque fois.
  • Traiter un lot de n enregistrements des premières partitions disponibles
  • Processus Un lot de n enregistre des partitions dans la rotation rond-robine

J'ai trouvé le partition.assignment.strategy Configuration pour Ranged ou RoundRobin cidvistiques, mais cela ne détermine que la manière dont les consommateurs sont assignés des partitions non pas de la manière dont elle consomme à partir des partitions qu'il est attribué.

J'ai commencé à creuser dans la source de Kafkaconsumer et - # sondage () Menez-moi à la # pollforfetches ()# pollorfetches () puis mène-moi à - Fetcher # FetetchedRecords () et Fetcher # SendFetches ()

Cela me conduit juste à essayer de suivre le long de la totalité de la totalité classe d'extratères tous ensemble et peut-être que c'est juste en retard ou peut-être que je n'ai tout simplement pas creusé de loin, mais j'ai du mal à démêler exactement comment un consommateur va Processus multiples partitions assignées.

Fond

Travailler sur un pipeline de données soutenu par Kafka flux.

À plusieurs étapes de ce pipeline comme enregistrements sont traités par différents Kafka applications de flux, le flux est joint à des sujets compactés flux par des sources de données externes fournissant les données requises qui seront complétées dans les enregistrements avant de continuer à la prochaine étape du traitement.

En route, plusieurs sujets de lettre dépassés peuvent être adaptés aux sources de données externes qui auraient augmenté l'enregistrement. Cela pourrait être dû au fait que les données ne sont tout simplement pas disponibles (événement ou campagne ne sont pas encore en cours) ou ce sont de mauvaises données et ne correspondront jamais.

L'objectif est de republier des documents du sujet de la lettre impayée lorsque de nouvelles données augmentées sont publiées afin que nous puissions correspondre aux enregistrements précédemment inégalés du sujet de la lettre impayée afin de les mettre à jour et de les envoyer en baisse de manière supplémentaire.

Les enregistrements ont potentiellement échoué à faire correspondre à plusieurs tentatives et pourraient avoir plusieurs copies dans le sujet de la lettre imparti, nous souhaitons donc seulement reproduire des enregistrements existants (avant la dernière compensation au moment de la démarrage de l'application) ainsi que des dossiers envoyés au sujet de la lettre impayée. Depuis la dernière fois que l'application a couru (après la compensation du groupe de consommateurs précédemment enregistré).

Cela fonctionne bien car mon consommateur filtre tous les enregistrements arrivant après le démarrage de la demande et que mon producteur gère mon groupe de consommateurs compacte en commettant les compensations dans le cadre de la transaction de publication.

Mais je veux m'assurer que je vais éventuellement consommer de toutes partitions, car j'ai couru dans un cas d'Edge étrange où des enregistrements non attribués sont retraités et atterrissent dans la même partition qu'auparavant dans le sujet de la lettre morte uniquement pour être filtré par le consommateur. Et bien qu'il ne s'agisse pas de nouveaux lots d'enregistrements à traiter, il y a des partitions qui n'ont pas encore été retraitées non plus.

Toute aide à comprendre comment un seul consommateur traite plusieurs partitions assignées seraient grandement appréciées.

15
DVS

Vous étiez sur les bonnes pistes en regardant Fetcher comme la majeure partie de la logique est là.

D'abord comme le consommateur javadoc mentionne:

Si un consommateur est attribué plusieurs partitions pour récupérer des données, il essaiera de consommer de toutes toutes en même temps, en donnant efficacement ces partitions la même priorité à la consommation.

Comme vous pouvez l'imaginer, dans la pratique, il y a quelques points à prendre en compte.

  • Chaque fois que le consommateur tente d'aller chercher de nouveaux enregistrements, il exclura des partitions pour lesquelles il a déjà des enregistrements en attente (d'une précédente récupération). Les partitions qui ont déjà une demande de récupération en vol sont également exclues.

  • Lorsque vous récupérez des enregistrements, le consommateur spécifie fetch.max.bytes Et max.partition.fetch.bytes Dans la demande de récupération. Celles-ci sont utilisées par les courtiers pour déterminer respectivement la quantité de données à revenir au total et à la partition. Ceci est également appliqué à toutes les partitions.

En utilisant ces 2 approches, par défaut, le consommateur tente de consommer de toutes les partitions équitablement. Si ce n'est pas le cas, Changer fetch.max.bytes Ou max.partition.fetch.bytes Aide généralement.

Au cas où, vous voulez hiérarchiser certaines partitions sur d'autres, vous devez utiliser pause() et resume() Pour contrôler manuellement la consommation couler.

4
Mickael Maison