Zrozumienie tematów i partycji platformy Kafka

185

Zaczynam uczyć się języka Kafka dla potrzeb rozwiązań dla przedsiębiorstw.

Podczas moich lektur przyszło mi do głowy kilka pytań:

  1. Kiedy producent tworzy wiadomość - określa temat, do którego chce wysłać wiadomość, czy to prawda? Czy dba o partycje?
  2. Kiedy abonent działa - czy określa swój identyfikator grupy tak, aby mógł być częścią klastra odbiorców o tej samej tematyce, czy też kilku tematów, którymi ta grupa konsumentów jest zainteresowana?
  3. Czy każda grupa konsumentów ma odpowiednią partycję w brokerze, czy też każdy konsument ją ma?

  4. Czy przegrody są tworzone przez brokera, a zatem nie są problemem dla konsumentów?

  5. Ponieważ jest to kolejka z przesunięciem dla każdej partycji, czy to konsument jest odpowiedzialny za określenie, które komunikaty chce odczytać? Czy musi ratować swój stan?

  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?

Pinidbest
źródło

Odpowiedzi:

162

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:

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 mniejsza niż partycje tematyczne
  • 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 odbiorców równa liczbie partycji tematycznych
  • 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 liczba konsumentów większa niż liczba partycji tematycznych

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 :

  1. Jest to jeden z wybranych brokerów w klastrze po stronie serwera Kafka.
  2. Konsumenci kontaktują się z koordynatorem grupy w celu wykonania offsetowych zatwierdzeń i żądań pobierania.
  3. 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.resetkonfiguracją, 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.

mrsrinivas
źródło
5
Cześć ! Jestem autorem zaakceptowanej odpowiedzi, ale myślę, że twoja też jest naprawdę fajna, zwłaszcza w punkcie numer 3, gdzie diagramy sprawiają, że wszystko jest o 200% jaśniejsze! Czy uważasz, że powinniśmy się połączyć?
C4stor
Chodziło mi o to, że ja (lub ty) moglibyśmy włączyć elementy twojej odpowiedzi do mojej, aby zwiększyć ich widoczność i poprawić tę (obecnie) najlepszą odpowiedź. Ale nie zrobiłbym tego bez twojej zgody!
C4stor
Dlaczego nie można zmapować wielu konsumentów na partycję? Aby wiadomość została przetworzona tylko raz? Dzięki za odpowiedź.
g10guang
1
@ g10guang: To z powodu trudności w utrzymaniu offsetu zatwierdzeń .
mrsrinivas
1
Inny scenariusz. Możesz subskrybować / przypisać JEDNĄ partycję i WIELU konsumentów. Broker dostarczy rekordy tylko pierwszemu zarejestrowanemu konsumentowi. Ale załóżmy, że pierwszy konsument potrzebuje więcej czasu na przetworzenie zadania niż interwał sondowania. Rekordowe zużycie nie jest przypisywane brokerowi. Broker rozumie, że konsument spędzał czas. W tym stanie broker uruchamia ponowne równoważenie, wysyłając nowo przypisane partycje do wszystkich swoich odbiorców. Wiadomość jest ponownie konsumowana przez innego konsumenta, mimo że nadal jest przetwarzana przez C1. Bądź ostrożny.
Ruben Daddario
127

Zróbmy to w kolejności :)

1 - Kiedy producent tworzy wiadomość - określi temat, do którego chce wysłać wiadomość, czy to prawda? Czy dba o partycje?

Domyślnie producent nie dba o partycjonowanie. Możesz użyć niestandardowego partycjonera, aby mieć lepszą kontrolę, ale jest to całkowicie opcjonalne.


2 - Gdy abonent działa - Czy określa swój identyfikator grupy, aby mógł być częścią klastra konsumentów o tej samej tematyce lub kilku tematach, którymi ta grupa konsumentów jest zainteresowana?

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.


3 - Czy każda grupa konsumentów ma odpowiednią partycję w brokerze, czy też każdy konsument ją ma?

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ę.


4 - Czy przegrody utworzone przez brokera nie są zatem problemem dla konsumentów?

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.


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?

Tak, konsumenci zapisują przesunięcie na temat na partycję. Jest to całkowicie obsługiwane przez Kafkę, nie martw się o to.


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 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ę.

C4stor
źródło
3
Sry :) Trochę trudno jest wyjaśnić cały proces kafki w pudełkach po 500 znaków, sugeruję przeczytanie kafka.apache.org/documentation.html#theconsumer (i prawdopodobnie resztę sekcji 4, o wewnętrznych właściwościach kafki ). Zasadniczo: konsumenci żądają kompensacji oszczędności, ale są one zapisywane gdzie indziej.
C4stor
Właśnie to przeczytałem i nadal nie wyjaśnia, gdzie się to odbywa: Kafka traktuje to inaczej. Nasz temat jest podzielony na zestaw całkowicie uporządkowanych przegród, z których każda jest w danym momencie konsumowana przez jednego konsumenta. Oznacza to, że pozycja konsumenta w każdej partycji to tylko jedna liczba całkowita, przesunięcie następnego komunikatu do wykorzystania. To sprawia, że ​​stan o tym, co zostało zużyte, jest bardzo mały, tylko jedna liczba na każdą partycję. Ten stan można okresowo sprawdzać. To sprawia, że ​​odpowiednik potwierdzeń wiadomości jest bardzo tani.
Pinidbest
20

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/

ybonda
źródło
Czy partycja służy tylko do równoważenia obciążenia tematu?
g10guang
1
@ g10guang: partycje pomagają również w równoległym przetwarzaniu wiadomości.
mrsrinivas
Proszę o poprawienie mnie jeśli się mylę, gdy wiadomość wysłana przez producenta i jak pojawia się w temacie to kopiuje ją na partycje zgodnie z konfiguracjami i potem konsumuje. Dobrze?
Atul
1
@Atul wiadomość zostanie dołączona do 1 z partycji dla tego tematu zgodnie z bieżącą konfiguracją partycji (domyślnie hash klucza wiadomości określa, do której partycji trafia wiadomość) i tak, konsument odbierze wiadomość jako zużywa wiadomości z tej partycji
Kevin Hooke,
@Kevin Hooke, dziękuję za wyjaśnienie i jasne zrozumienie.
Atul