Co decyduje o offsecie konsumenckim Kafka?

Jestem stosunkowo nowy w Kafce. Zrobiłem z tym trochę eksperymentu, ale kilka rzeczy nie jest dla mnie niejasnych w odniesieniu do offsetu konsumenckiego. Z tego, co zrozumiałem, kiedy konsument zaczyna, przesunięcie, z którego zacznie czytać, jest określone przez ustawienie konfiguracji auto.offset.reset (popraw mnie, jeśli się mylę).

Powiedzmy na przykład, że w temacie jest 10 wiadomości (przesunięcia od 0 do 9), a konsument przypadkiem skonsumował 5 z nich, zanim upadł (lub zanim zabiłem konsumenta). Więc powiedz Wznawiam proces konsumencki. Moje pytania to:

Jeśli auto.offset.reset jest ustawione na smallest, to czy zawsze zacznie pobierać od offsetu 0 ?

Jeśli auto.offset.reset jest ustawione na largest, czy zacznie pobierać od offsetu 5 ?

Czy zachowanie wobec tego typu scenariuszy jest zawsze deterministyczne ? Proszę nie wahaj się skomentować, jeśli cokolwiek w moim pytaniu jest niejasne. Z góry dzięki.
Author: Asif Iqbal, 2015-09-04

3 answers

To jest nieco bardziej skomplikowane niż opisałeś. Konfiguracja auto.offset.reset jest uruchamiana tylko wtedy, gdy twoja grupa konsumentów nie ma gdzieś poprawnego offsetu (2 obsługiwane magazyny offsetu to teraz Kafka i Zookeeper). I to zależy również od tego, jakiego rodzaju konsumenta używasz.

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

  1. Masz konsumenta w grupie group1, który skonsumował 5 wiadomości i zmarł. Następnym razem Uruchom tego konsumenta nie użyje nawet tego auto.offset.reset config i będzie kontynuowany z miejsca, w którym umarł, ponieważ po prostu pobierze zapisany offset z magazynu offsetowego(Kafka lub ZK, jak wspomniałem).

  2. Masz wiadomości w temacie (tak jak opisałeś) i uruchamiasz konsumenta w nowej grupie konsumenckiej group2. Nie ma nigdzie zapisanego offsetu i tym razem konfiguracja auto.offset.reset zdecyduje, czy zacząć od początku tematu (smallest), czy od końca tematu (largest)

Jeszcze jedna rzecz, która ma wpływ na to, jaka wartość offsetu będzie odpowiadać smallest i largest configs, to Polityka przechowywania logów. Wyobraź sobie, że masz temat z retencją skonfigurowany do 1 godziny. Tworzysz 5 wiadomości, a godzinę później publikujesz 5 kolejnych wiadomości. largest offset nadal pozostanie taki sam jak w poprzednim przykładzie, ale smallest nie będzie mógł być 0, ponieważ Kafka już usunie te wiadomości i tym samym najmniejszy dostępny offset będzie 5.

Wszystko, o czym mowa powyżej, nie jest związane z SimpleConsumer i za każdym razem, gdy go uruchomisz, będzie decydowało od czego zacząć korzystanie z konfiguracji auto.offset.reset.

 165
Author: serejja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-04 07:12:42

Tylko Aktualizacja: od Kafka 0.9 i z powrotem, Kafka używa nowej wersji Java konsumenta i auto.przesunięcie.nazwy parametrów reset zostały zmienione; z podręcznika:

Co zrobić, gdy w Kafce nie ma przesunięcia początkowego lub jeśli prąd offset już nie istnieje na serwerze (np. dlatego, że dane usunięto): {]}

Najwcześniejsze : automatyczne resetowanie przesunięcia na najwcześniejsze przesunięcie

Najnowszy : automatycznie zresetuj przesunięcie do ostatniego przesunięcia

None : wyrzuć wyjątek dla konsumenta, jeśli nie znaleziono poprzedniego offsetu dla grupy konsumenta

Cokolwiek innego: wyrzuć wyjątek dla konsumenta.

Spędziłem trochę czasu, aby znaleźć to po sprawdzeniu zaakceptowanej odpowiedzi, więc pomyślałem, że może być przydatne dla społeczności, aby ją opublikować.

 44
Author: israel.zinc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-05 20:34:51

Dalej są przesunięcia.retencja.minut. Jeśli czas od ostatniego commita jest > offsets.retention.minutes, niż auto.offset.reset również kopie

 3
Author: Sasa Ninkovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 13:53:26