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:
Si le auto.offset.reset
est réglé sur smallest
, est-ce qu'il commencera toujours à consommer à partir du décalage 0?
Si le auto.offset.reset
est réglé sur largest
, est-ce qu'il va commencer à consommer à partir du décalage 5?
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.
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:
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é).
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.
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.
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