web-dev-qa-db-fra.com

Qu'est-ce qui détermine Kafka offset du consommateur?

Je suis relativement nouveau à Kafka. J'ai fait quelques expériences avec, mais quelques points ne sont pas clairs pour moi en ce qui concerne la compensation des consommateurs. D'après ce que j'ai compris jusqu'à présent, lorsqu'un client démarre, le décalage à partir duquel il commence à lire est déterminé par le paramètre de configuration auto.offset.reset (corrigez-moi si je me trompe).

Maintenant, disons par exemple qu'il y a 10 messages (décalages 0 à 9) dans le sujet, et qu'un consommateur en a consommé 5 avant qu'il ne s'effondre (ou avant que je tue le consommateur). Ensuite, dites que je redémarre ce processus consommateur. Mes questions sont:

  1. Si le auto.offset.reset est réglé sur smallest, est-ce qu'il commencera toujours à consommer à partir du décalage 0?

  2. Si le auto.offset.reset est réglé sur largest, est-ce qu'il va commencer à consommer à partir du décalage 5?

  3. Le comportement vis-à-vis de ce genre de scénario est-il toujours déterministe?

S'il vous plaît, n'hésitez pas à commenter si quelque chose dans ma question n'est pas clair. Merci d'avance.

142
Asif Iqbal

C'est un peu plus complexe que ce que vous avez décrit. La configuration de auto.offset.reset commence UNIQUEMENT si votre groupe de consommateurs ne dispose pas d'un décalage valide commis quelque part (2 mémoires de décalage prises en charge sont désormais Kafka et Zookeeper). Et cela dépend aussi du type de consommateur que vous utilisez.

Si vous utilisez un consommateur Java de haut niveau, imaginez les scénarios suivants:

  1. Vous avez un consommateur dans un groupe de consommateurs group1 qui a consommé 5 messages et est décédé. La prochaine fois que vous lancerez ce consommateur, il n'utilisera même pas cette auto.offset.reset config et continuera à partir de l'endroit où il est mort car il récupérera simplement l'offset stocké dans la mémoire offset (Kafka ou ZK, comme je l'ai mentionné).

  2. Vous avez des messages dans une rubrique (comme vous l'avez décrit) et vous démarrez un consommateur dans un nouveau groupe de consommateurs group2. Il n'y a pas de décalage stocké nulle part et cette fois, le auto.offset.reset config décidera s'il faut commencer au début du sujet (smallest) ou à la fin du sujet (largest)

Une autre chose qui affecte la valeur de décalage qui correspondra à smallest et largest configs est la stratégie de conservation des journaux. Imaginez que vous ayez un sujet avec rétention configuré pour 1 heure. Vous produisez 5 messages, puis une heure plus tard, vous publiez 5 autres messages. Le décalage largest restera toujours le même que dans l'exemple précédent mais le smallest ne pourra pas être 0 car Kafka supprimera déjà ces messages et ainsi, le plus petit décalage disponible sera 5.

Tout ce qui est mentionné ci-dessus n'est pas lié à SimpleConsumer et chaque fois que vous l'exécutez, il décidera par où commencer à utiliser le auto.offset.reset config.

226
serejja

Juste une mise à jour: à partir de Kafka0.9 et suivant, Kafka utilise une nouvelle version Java du consommateur et les noms de paramètres auto.offset.reset ont été modifiés; Du manuel:

Que faire lorsqu'il n'y a pas de décalage initial dans Kafka ou si le décalage actuel n'existe plus sur le serveur (par exemple parce que ces données ont été supprimées):

plus tôt: réinitialise automatiquement le décalage sur le décalage le plus ancien

latest: réinitialise automatiquement le décalage sur le dernier décalage

none: Exception renvoyée au consommateur si aucun décalage précédent n'est trouvé pour le groupe du consommateur

toute autre chose: jetez une exception au consommateur.

J'ai passé un peu de temps à trouver ceci après avoir vérifié la réponse acceptée, alors j'ai pensé qu'il pourrait être utile que la communauté l'affiche.

74
israel.zinc

De plus, il existe des offsets.retention.minutes. Si le temps écoulé depuis la dernière validation est> offsets.retention.minutes, alors auto.offset.reset lance également

7
Sasa Ninkovic