Le document https://www.safaribooksonline.com/library/view/kafka-the-definitive/9781491936153/ch04.html dit que "Notez qu'avec auto -commit activé, un appel à poll valide toujours le dernier décalage renvoyé par le sondage précédent. Il ne sait pas quels événements ont été réellement traités, il est donc essentiel de toujours traiter tous les événements renvoyés par poll avant d'appeler à nouveau poll (ou avant d'appeler close (), il valide également automatiquement les décalages) ". Si tel est le cas, comment cela fonctionne-t-il si auto.commit.interval.ms est plus grand que le temps nécessaire pour traiter les messages reçus de la précédente poll()
.
Pour le rendre plus concret, considérons le scénario où j'ai ce qui suit:
enable.auto.commit=true
auto.commit.interval.ms=10
Et j'appelle poll()
en boucle.
1) Au premier appel à poll()
, j'obtiens 1000 messages (offset 2000-3000) et il faut 1 ms pour traiter tous les 1000 messages
2) J'appelle à nouveau poll()
. Dans ce 2ème appel à poll()
, il devrait valider le dernier offset 3000 renvoyé par le précédent poll()
mais puisque auto.commit.interval.ms
Est réglé sur 10 ms, il ne validera pas l'offset encore, non?
Dans ce scénario, la compensation engagée sera de plus en plus en retard par rapport à la dernière compensation qui a été réellement traitée?
Quelqu'un pourrait-il clarifier/confirmer?
Vous décrivez correctement le comportement. Cependant, votre conclusion n'est pas correcte. La compensation engagée ne tardera pas de plus en plus. Une fois l'intervalle de validation automatique écoulé, le prochain appel au sondage valide tous les messages traités.
Disons que vous appelez poll toutes les 10 ms et que vous définissez commit-interval sur 100 ms. Ainsi, chaque 10ème appel à interroger sera validé (et cette validation couvre tous les messages des 10 derniers appels à interroger).