Od czego zależy offset konsumencki Kafki?

169

Jestem stosunkowo nowy w Kafce. Trochę z tym eksperymentowałem, ale kilka rzeczy jest dla mnie niejasnych, jeśli chodzi o offset konsumencki. Z tego, co do tej pory zrozumiałem, kiedy konsument zaczyna, przesunięcie, od którego zacznie czytać, jest określone przez ustawienie konfiguracji auto.offset.reset(popraw mnie, jeśli się mylę).

Teraz powiedzmy na przykład, że w temacie jest 10 wiadomości (przesunięcia od 0 do 9), a konsument zdarzyło się skonsumować 5 z nich, zanim zniknął (lub zanim go zabiłem). Następnie powiedz, że wznawiam ten proces konsumencki. Moje pytania to:

  1. Jeśli auto.offset.resetjest ustawiona na smallest, czy zawsze będzie zużywać od offsetu 0?

  2. Jeśli auto.offset.resetjest ustawiona na largest, czy zacznie zużywać od przesunięcia 5?

  3. Czy zachowanie w tego rodzaju scenariuszach jest zawsze deterministyczne?

Nie wahaj się komentować, jeśli cokolwiek w moim pytaniu jest niejasne. Z góry dziękuję.

Asif Iqbal
źródło

Odpowiedzi:

260

Jest to trochę bardziej złożone niż opisałeś.
Te auto.offset.resetrzuty config jedynie wtedy, gdy grupa konsumentów nie posiada ważnego przesunięcia popełnił gdzieś (2 Obsługiwane offsetowe magazyny są teraz Kafka i Zookeeper), a także zależy od rodzaju konsumenta użyć.

Jeśli używasz wysokiego poziomu konsumenta Java, wyobraź sobie następujące scenariusze:

  1. Masz konsumenta w grupie konsumentów group1, która zużyła 5 wiadomości i umarła. Następnym razem, gdy uruchomisz tego konsumenta, nawet nie użyje tej auto.offset.resetkonfiguracji i będzie kontynuował od miejsca, w którym umarł, ponieważ po prostu pobierze przechowywane przesunięcie z pamięci offsetowej (Kafka lub ZK, jak wspomniałem).

  2. Masz wiadomości w temacie (tak jak opisałeś) i rozpoczynasz konsumenta w nowej grupie konsumentów group2. Nigdzie nie ma zapisanego przesunięcia i tym razem auto.offset.resetconfig zdecyduje, czy zacząć od początku tematu ( earliest) czy od końca tematu ( latest)

Jeszcze jedna rzecz, która wpływa na to, jakiej wartości przesunięcia będzie odpowiadać earliesti latestkonfiguracji, to polityka przechowywania dziennika. Wyobraź sobie, że masz temat z okresem przechowywania skonfigurowanym na 1 godzinę. Tworzysz 5 wiadomości, a godzinę później publikujesz 5 kolejnych. latestPrzesunięcie będzie nadal pozostają takie same jak w poprzednim przykładzie, ale earliestnie będzie mógł być 0bo Kafka będzie już usunąć te wiadomości i dlatego najwcześniej dostępne będą offsetowych 5.

Wszystko, o czym wspomniano powyżej, nie jest związane z SimpleConsumeri za każdym razem, gdy go uruchomisz, zdecyduje, od czego zacząć korzystać z auto.offset.resetconfig.

Jeśli używasz wersji Kafka starsze niż 0.9, trzeba wymienić earliest, latestz smallest, largest.

serejja
źródło
3
Bardzo dziękuję za odpowiedź. A więc dla konsumenta wysokiego szczebla, kiedy konsument coś zobowiązuje (czy to w ZK, czy w Kafce), auto.offset.resetto nie ma to już znaczenia? Jedyne znaczenie tego ustawienia ma miejsce, gdy nic nie jest zobowiązane (a idealnie byłoby to przy pierwszym uruchomieniu konsumenta)?
Asif Iqbal
2
Dokładnie tak, jak opisałeś
serejja
1
@serejja Witam - a co powiesz na to, że zawsze mam 1 konsumenta na grupę i scenariusz nr 1 Twojej odpowiedzi jest dla mnie? Czy to byłoby to samo?
ha9u63ar
1
@ ha9u63ar nie całkiem zrozumiał Twoje pytanie. Jeśli zrestartujesz konsumenta w tej samej grupie, tak, nie użyje on auto.offset.reseti nie będzie kontynuował od zatwierdzonego przesunięcia. Jeśli zawsze korzystasz z innej grupy konsumentów (np. auto.offset.reset
Generuj
@serejja tak i to nie działa dla mnie. czy mógłbyś
rzucić
82

Tylko aktualizacja: od wersji 0.9 Kafki i następnych, Kafka używa nowej wersji Java konsumenta, a nazwy parametrów auto.offset.reset uległy zmianie; Z instrukcji:

Co zrobić, gdy nie ma początkowego przesunięcia w Kafce lub jeśli bieżące przesunięcie nie istnieje już na serwerze (np. Ponieważ te dane zostały usunięte):

najwcześniej : automatycznie resetuje przesunięcie do najwcześniejszego przesunięcia

najnowszy : automatycznie resetuje przesunięcie do ostatniego przesunięcia

none : zgłoś wyjątek do konsumenta, jeśli nie zostanie znalezione poprzednie przesunięcie dla grupy konsumentów

cokolwiek innego: zgłoś wyjątek do konsumenta.

Po sprawdzeniu zaakceptowanej odpowiedzi poświęciłem trochę czasu na znalezienie tego, więc pomyślałem, że opublikowanie tego może być przydatne dla społeczności.

Israel Cynk
źródło
9

Dalej jest przesunięcie. Retencja. Minuty. Jeśli czas od ostatniego zatwierdzenia wynosi> offsets.retention.minutes, to auto.offset.resetrównież zaczyna działać

Sasa Ninkovic
źródło
1
czy to nie wydaje się zbędne w przypadku przechowywania dziennika? czy retencja setset powinna opierać się na przechowywaniu logów?
mike01010
@ mike01010 to prawda. Powinien opierać się na zachowaniu dziennika, to jedno z proponowanych rozwiązań w bilecie. Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. Issues.apache.org/jira/browse/KAFKA-3806
saheb
Że odpowiedź przestraszony mnie przez jakiś czas, dopóki nie sprawdzić dokumentację o offsets.retention.minutes. <B> Po grupa konsument traci wszystkie swoje konsumentów (czyli staje się pusty) jego przesunięcia będą przechowywane przez ten okres przechowywania, zanim się wyrzucić </ b> na autonomiczny konsumentów (przy użyciu przypisania ręcznego), kompensaty wygasną po czasie ostatniego zatwierdzenia plus ten okres przechowywania. (To jest dla Kafka 2.3)
jumping_monkey