Ten post ma już odpowiedzi, ale dodaję swój widok z kilkoma zdjęciami z Kafka Definitive Guide
Zanim odpowiemy na każde pytanie, dodajmy przegląd komponentów producenta:
1. Kiedy producent tworzy wiadomość - określi temat, do którego chce wysłać wiadomość, czy to prawda? Czy dba o partycje?
Producent zdecyduje o umieszczeniu dowolnego komunikatu w partycji docelowej, w zależności od:
- Identyfikator partycji, jeśli jest określony w wiadomości
- klucz% num partycji , jeśli nie podano identyfikatora partycji
- Działanie okrężne, jeśli w komunikacie nie ma identyfikatora partycji ani klucza wiadomości, co oznacza, że dostępna jest tylko wartość
2. Kiedy abonent działa - czy określa swój identyfikator grupy tak, aby mógł być częścią klastra konsumentów o tej samej tematyce lub kilku tematach, którymi ta grupa konsumentów jest zainteresowana?
Należy zawsze konfigurować group.id, chyba że używasz prostego interfejsu API przypisywania i nie musisz przechowywać offsetów w Kafce. Nie będzie częścią żadnej grupy. źródło
3. Czy każda grupa konsumentów ma odpowiednią partycję w brokerze, czy też każdy konsument ją ma?
W jednej grupie odbiorców każda partycja będzie przetwarzana tylko przez jednego konsumenta . Oto możliwe scenariusze
- Liczba odbiorców jest mniejsza niż liczba partycji tematycznych, wtedy do jednego odbiorcy w grupie można przypisać wiele partycji
- Liczba konsumentów taka sama jak liczba partycji tematycznych, a następnie mapowanie partycji i konsumentów może wyglądać jak poniżej,
- Liczba konsumentów jest wyższa niż liczba partycji tematycznych, wtedy mapowanie partycji i konsumentów można zobaczyć poniżej, nieskuteczne, sprawdź konsumenta 5
4. Czy jako przegrody stworzone przez brokera nie martwisz się o konsumentów?
Konsument powinien być świadomy liczby przegród, o czym była mowa w pytaniu 3.
5. Ponieważ jest to kolejka z przesunięciem dla każdej partycji, czy konsument jest odpowiedzialny za określenie, które komunikaty chce odczytać? Czy musi ratować swój stan?
Kafka (a konkretnie koordynator grupy ) dba o stan przesunięcia, tworząc wiadomość do wewnętrznego tematu __consumer_offsets , to zachowanie można również skonfigurować jako ręczne, ustawiającenable.auto.commit
na false
. W takim przypadku consumer.commitSync()
i consumer.commitAsync()
może być pomocne przy zarządzaniu przesunięciem.
Więcej na temat Koordynatorze Grupy :
- Jest to jeden z wybranych brokerów w klastrze po stronie serwera Kafka.
- Konsumenci kontaktują się z koordynatorem grupy w celu wykonania offsetowych zatwierdzeń i żądań pobierania.
- Konsument wysyła okresowe bicie serca do koordynatora grupy.
6. Co się stanie, gdy wiadomość zostanie usunięta z kolejki? - Na przykład: retencja trwała 3 godziny, potem mija czas, jak obsługiwane jest przesunięcie po obu stronach?
Jeśli jakikolwiek konsument rozpocznie pracę po okresie przechowywania, wiadomości zostaną wykorzystane zgodnie z auto.offset.reset
konfiguracją, która może być latest/earliest
. technicznie jest to latest
(zacznij przetwarzać nowe wiadomości), ponieważ wszystkie wiadomości wygasły do tego czasu, a przechowywanie jest konfiguracją na poziomie tematu.
Zróbmy to w kolejności :)
Domyślnie producent nie dba o partycjonowanie. Możesz użyć niestandardowego partycjonera, aby mieć lepszą kontrolę, ale jest to całkowicie opcjonalne.
Tak, konsumenci dołączają (lub tworzą, jeśli są sami) grupę konsumentów, aby dzielić się obciążeniem. Nie ma dwóch konsumentów z tej samej grupy, które nigdy nie otrzymają tej samej wiadomości.
Ani. Wszystkim odbiorcom w grupie odbiorców przypisywany jest zestaw partycji, pod dwoma warunkami: żaden z dwóch odbiorców w tej samej grupie nie ma wspólnej partycji - a grupie odbiorców jako całości przypisuje się każdą istniejącą partycję.
Nie są, ale na podstawie 3 widać, że posiadanie większej liczby konsumentów niż istniejących partycji jest całkowicie bezużyteczne, więc jest to maksymalny poziom równoległości do wykorzystania.
Tak, konsumenci zapisują przesunięcie na temat na partycję. Jest to całkowicie obsługiwane przez Kafkę, nie martw się o to.
Jeśli konsument kiedykolwiek zażąda przesunięcia niedostępnego dla partycji u brokerów (na przykład z powodu usunięcia), wchodzi w tryb błędu i ostatecznie resetuje się dla tej partycji do najnowszej lub najstarszej dostępnej wiadomości (w zależności od wartość konfiguracji auto.offset.reset) i kontynuuj pracę.
źródło
Kafka używa tematu koncepcję która ma na celu uporządkowanie przepływu wiadomości.
Aby zrównoważyć obciążenie, temat można podzielić na wiele partycji i replikować między brokerami.
Partycje są uporządkowanymi, niezmiennymi sekwencjami komunikatów, które są stale dołączane, np. Dziennik zatwierdzeń.
Wiadomości w partycji mają kolejny numer identyfikacyjny, który jednoznacznie identyfikuje każdą wiadomość w partycji.
Partycje umożliwiają skalowanie dziennika tematu poza rozmiar, który zmieści się na pojedynczym serwerze (brokerze) i będzie działać jako jednostka równoległości.
Partycje tematu są dystrybuowane przez brokerów w klastrze Kafka, gdzie każdy broker obsługuje dane i żądania dotyczące udziału partycji.
Każda partycja jest replikowana przez konfigurowalną liczbę brokerów w celu zapewnienia odporności na uszkodzenia.
Dobrze wyjaśnione w tym artykule: http://codeflex.co/what-is-apache-kafka/
źródło