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 ?
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:
Masz konsumenta w grupie
group1
, który skonsumował 5 wiadomości i zmarł. Następnym razem Uruchom tego konsumenta nie użyje nawet tegoauto.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).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 konfiguracjaauto.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
.
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ć.
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
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