2017-09-27 4 views
0

J'essaie de me faire une idée des consommateurs de Kafka et j'aimerais savoir si le cas d'utilisation suivant peut être résolu en utilisant Kafka.Kafka - groupes de consommateurs synchronisés

Mon cas d'utilisation est essentiellement celui-ci:

J'ai un flux que je voudrais être consommé en synchronisation par plusieurs consommateurs. En d'autres termes, j'ai un premier consommateur qui commence à consommer le flux, puis un autre consommateur arrive plus tard. J'aimerais que ce deuxième consommateur commence à consommer le flux à l'offset où est actuellement le premier consommateur.

Je sais que j'ai besoin d'avoir les consommateurs dans deux groupes différents. Mais il est clair pour moi:

  • sur la façon ou s'il est possible de coordonner les groupes contrebalancées
  • si je me attends à un temps d'attente pour la tâche telle coordination

Répondre

1

Vous n'avez pas besoin de deux différents groupes, tous les consommateurs peuvent cocher un sujet. Ou autant qu'ils aiment, d'ailleurs.

décalage

Les messages sont identifiés par leur généralement la date d'arrivée, de sorte que tous les clients ont besoin de dire au producteur « ma dernière visite à 10h00, donnez-moi tous les nouveaux messages ». Donc, tout ce que chaque client doit garder en mémoire, c'est quand le sujet individuel a été vérifié en dernier.

latence

c'est une sorte de "la portée" à ce stade. Bien sûr, il y aura temps d'attente, mais cela dépend de l'environnement, comme « combien de consommateurs », « combien de sujets », « format », etc.

aussi bien que votre usecase être résolu en utilisant kafka

En bref: oui. "Un consommateur peut-il continuer là où il en reste un autre", les consommateurs pourraient échanger le dernier index entre eux, bien sûr cela nécessiterait une certaine synchronisation interne. Kafka lui-même ne se soucie pas des consommateurs, donc il ne se tiendra pas au courant de l'indice le plus récent. Vous devez faire le travail. Une autre possibilité consisterait à consommer réellement les messages (par exemple, les supprimer de la file une fois consommés), de sorte que chaque fois qu'un autre consommateur atteint la file d'attente, il est garanti de recevoir les messages d'un autre consommateur. Bien sûr, cela dépend de votre utilisation, pouvez-vous réellement supprimer vos messages de la file d'attente.

+0

Je proposais deux groupes différents car chaque consommateur devrait consommer les mêmes messages. Ma compréhension était, jusqu'à aujourd'hui, que dès qu'un consommateur a consommé un message, l'autre consommateur ne peut pas le consommer, sauf s'il appartient à un groupe différent. – Serge

+0

Cela dépend du "mode", si vous avez choisi de garder tous les messages dans la file d'attente pendant, par exemple, un mois, tout consommateur peut lire tous les messages. Tout ce dont ils ont besoin pour faire la queue est un horodatage de l'index. La file d'attente répondra avec tous les messages après l'horodatage. Pensez-y comme un tampon de données, un consommateur pourrait effectivement laisser tomber toutes ses données et les relire dans la file d'attente. Et bien sûr, un consommateur peut lire tous les sujets qu'il veut, en gros, kafka ne se soucie pas des consommateurs. Ou les producteurs, d'ailleurs;) – Nikolas

+0

On dirait qu'il est possible de dire un "index timestamp" en utilisant seulement le Java Client (en utilisant offsetsForTimes) je ne l'ai pas trouvé pour Python ou Scala ... Existe-t-il un autre moyen? – Serge

0

Ce n'est pas un problème traité directement par kafka (le groupe de consommateurs consiste à distribuer des partitions entre les membres, pas à attribuer le même décalage), mais vous pouvez faire quelque chose pour cela. Vous pourriez simplement créer un autre sujet, où consumer1 posterait un offset ou une copie du message lu (donc vous auriez besoin de bth consumer et producer pour cela), et votre autre consommateur synchronisé réagirait contre ceci - bien sûr il y aurait un peu de latence pour ça.

Quel est votre cas d'utilisation derrière cela? Pourquoi ne pouvez-vous pas consommer différemment? Ne pourriez-vous pas plutôt avoir un consommateur, qui enverrait alors le message lu à différents processus, afin qu'ils soient effectivement synchronisés?Que voulez-vous dire par synchronized: consumer2 (et 3 et plus) ne consomment que le même message que consumer1 (ie ne peut pas consommer plus vite, ce que je suppose dans les deux solutions précédentes) possible, il serait vraiment mieux de connaître la raison derrière cela, peut-être il ya une meilleure façon de traiter les données

+0

au T1: - le premier a atteint un message consommateur offset = N - le deuxième départ du consommateur à consommer le même sujet, mais commencer à partir de l'offset = N au bureau de scrutin suivant, les consommateurs doivent consommer les mêmes messages – Serge

+0

bien, quand ils sondent dépendent de la vitesse à laquelle ils traitent les messages, ou quand ils interrogent exactement. Qu'est-ce que vous essayez d'atteindre exactement? (Pourquoi avez-vous besoin de synchro exacte?) – Treziac