Розуміння тем та розділів Kafka


185

Я починаю вивчати Кафку для цілей корпоративного рішення.

Під час читання мені на думку спадали деякі питання:

  1. Коли виробник виробляє повідомлення - він визначатиме тему, на яку хоче надіслати повідомлення, чи правильно це? Дбає про перегородки?
  2. Коли працює абонент - чи вказується його ідентифікатор групи, щоб він міг бути частиною групи споживачів тієї самої теми або декількох тем, які цікавлять цю групу споживачів?
  3. Чи кожна група споживачів має відповідний розділ у брокера чи у кожного споживача є такий?

  4. Чи створені брокером перегородки, а тому не викликають занепокоєння споживачів?

  5. Оскільки це черга зі зміщенням для кожного розділу, чи несе споживач обов'язок вказати, які повідомлення він хоче прочитати? Чи потрібно врятувати свою державу?

  6. Що відбувається, коли повідомлення вилучається з черги? - Наприклад: утримання тривало 3 години, потім проходить час, як обробляється зміщення з обох сторін?

Відповіді:


162

У цій публікації вже є відповіді, але я доповнюю свою думку декількома картинками з Посібника з остаточного пошуку Kafka

Перш ніж відповісти на кожне запитання, додамо огляд компонентів виробника:

огляд компонентів виробника

1. Коли виробник виробляє повідомлення - він визначатиме тему, на яку хоче надіслати повідомлення, чи правильно це? Дбає про перегородки?

Виробник вирішує цільовий розділ розміщення будь-якого повідомлення в залежності від:

  • Ідентифікатор розділу, якщо він вказаний у повідомленні
  • ключові розділи% num , якщо ідентифікатор розділу не згадується
  • Круглий мотоцикл, якщо ні ідентифікатор розділу, ні ключ повідомлення, у повідомленні немає, тобто існує лише значення

2. Коли працює абонент - чи вказується його ідентифікатор групи, щоб він міг бути частиною групи споживачів тієї самої теми або декількох тем, які цікавлять цю групу споживачів?

Ви завжди повинні налаштувати group.id, якщо ви не використовуєте простий API призначення та вам не потрібно зберігати компенсації в Kafka. Це не буде частиною жодної групи. джерело

3. Чи кожна група споживачів має відповідний розділ у брокера чи у кожного споживача є такий?

В одній групі споживачів кожен розділ буде оброблений лише одним споживачем . Це можливі сценарії

  • Кількість споживачів менше кількість тематичних розділів, тоді одному з споживачів групи можна призначити кілька розділів кількість споживачів менше, ніж тематичні розділи
  • Кількість споживачів однакова така як кількість тематичних розділів, тоді розділ та відображення споживачів можуть бути як нижче, кількість споживачів така ж, як кількість тематичних розділів
  • Кількість споживачів перевищує кількість тематичних розділів, тоді розміщення розділів та споживачів можна переглянути, як показано нижче, Неефективно, перевірте споживача 5 кількість споживачів більше кількості тематичних розділів

4. Як розділи, створені брокером, не викликають занепокоєння споживачів?

Споживач повинен знати про кількість розділів, про що йшлося в питанні 3.

5. Оскільки це черга зі зміщенням для кожного розділу, чи несе обов'язок споживач вказати, які повідомлення він хоче прочитати? Чи потрібно врятувати свою державу?

Кафка (конкретний координатор групи ) піклується про стан зсуву, створюючи повідомлення на внутрішню тему __consumer_offsets , таку поведінку можна налаштувати як вручну, так і встановивши enable.auto.commitна false. В цьому випадку consumer.commitSync()і consumer.commitAsync()може бути корисним для господарювання зміщення.

Більше про координатора групи :

  1. Це один з обраних брокерів у кластері з боку сервера Kafka.
  2. Споживачі взаємодіють із Координатором Групи для компенсації комісій та отримання запитів.
  3. Споживач періодично надсилає серцебиття до координатора групи.

6. Що відбувається, коли повідомлення вилучається з черги? - Наприклад: Утримання тривало 3 години, потім проходить час, як обробляється зміщення з обох сторін?

Якщо будь-який споживач починається після періоду зберігання, повідомлення будуть використовуватися відповідно до auto.offset.resetконфігурації, яка може бути latest/earliest. технічно це latest(почати обробку нових повідомлень), оскільки всі повідомлення, термін дії яких минув до цього часу, і збереження - це конфігурація на рівні теми.


5
Привіт ! Я автор прийнятої відповіді, але я вважаю, що і ваша справді приємна, особливо це стосується точки № 3, де діаграми роблять речі на 200% чіткішими! Як ви думаєте, ми повинні зливатися?
C4stor

Я мав на увазі, що я (або ти) можу включити елементи вашої відповіді в мою, щоб отримати їх більше наочності та покращити цю (наразі) верхню відповідь. Але я б не зробив це без вашої згоди!
C4stor

Чому не можна зіставити декількох споживачів до розділу? Щоб забезпечити повідомлення лише обробляти один раз? Thx для вашої відповіді.
g10guang

1
@ g10guang: Це через труднощі у здійсненні компенсації компенсації .
mrsrinivas

1
Інший сценарій. Ви можете мати один підрозділ і на нього підписати / МНОГО споживачів. Брокер доставить записи лише першому зареєстрованому споживачеві. Але припустимо, що перший споживач потребує більше часу для опрацювання завдання, ніж інтервал опитування. Рекордне споживання брокеру не береться. Брокер розуміє, що споживач повісився. У такому стані брокер спрацьовує зрівноважуючим шляхом надсилання нових призначених розділів всім своїм споживачам. Повідомлення знову споживається іншим споживачем, хоча воно ще обробляється C1. Будь обережний.
Рубен Даддаріо

127

Візьмемо це по порядку :)

1 - Коли виробник виробляє повідомлення - Він визначатиме тему, на яку хоче надіслати повідомлення, чи правильно це? Дбає про перегородки?

За замовчуванням виробник не переймається розділенням. У вас є можливість використовувати індивідуальний роздільник для кращого контролю, але це абсолютно необов’язково.


2 - Коли працює абонент - чи вказується його ідентифікатор групи, щоб він міг бути частиною кластеру споживачів тієї самої теми або декількох тем, які цікавлять цю групу споживачів?

Так, споживачі приєднуються (або створюють, якщо вони одні), до групи споживачів для розподілу навантаження. Жоден два споживачі в одній групі ніколи не отримають одне і те ж повідомлення.


3 - Чи кожна група споживачів має відповідний розділ у брокера чи у кожного споживача є такий?

Ні. Всім споживачам групи споживачів присвоюється набір розділів за двох умов: жоден споживач в одній групі не має спільних розділів - а споживчій групі в цілому присвоюється кожен існуючий розділ.


4 - Чи створені брокером перегородки не викликають занепокоєння споживачів?

Їх немає, але з 3 ви бачите, що мати більше споживачів, ніж існуючі перегородки, абсолютно марно, тож це ваш максимальний рівень паралелізму для споживання.


5 - Оскільки це черга зі зміщенням для кожного розділу, чи несе споживач обов'язок вказати, які повідомлення він хоче прочитати? Чи потрібно врятувати свою державу?

Так, споживачі зберігають компенсацію за темою на розділ. З цим повністю справляється Кафка, жодних турбот з цього приводу.


6 - Що відбувається, коли повідомлення вилучається з черги? - Наприклад: Утримання тривало 3 години, потім проходить час, як обробляється зміщення з обох сторін?

Якщо споживач коли-небудь вимагає компенсації, недоступної для розділу у посередників (наприклад, через видалення), він переходить у режим помилок і в кінцевому підсумку скидає для цього розділу або найновіше, або найдавніше доступне повідомлення (залежно від значення конфігурації auto.offset.reset) та продовжуйте роботу.


3
Sry :) Трохи важко пояснити весь процес kafka в 500 символьних полях, я пропоную прочитати kafka.apache.org/documentation.html#theconsumer (і, мабуть, решту розділу 4 про внутрішні кафки). В основному: споживачі вимагають збереження компенсацій, але ці збережені в іншому місці.
C4stor

Я просто прочитав це, і досі це не пояснює, де воно тримається: Кафка поводиться з цим інакше. Наша тема розділена на набір повністю упорядкованих розділів, кожну з яких споживає один споживач у будь-який момент часу. Це означає, що позиція споживача в кожному розділі - це лише одне ціле число, зміщення наступного повідомлення, яке потрібно споживати. Це робить стан про те, що було спожито дуже мало, лише одне число для кожної секції. Цей стан можна періодично перевіряти. Це робить еквівалент підтвердження повідомлень дуже дешевим.
Pinidbest

20

Kafka використовує концепцію теми, яка наводить порядок у потоці повідомлень.

Щоб збалансувати навантаження, тему можна розділити на кілька розділів і повторити між брокерами.

Розділи впорядковані, незмінні послідовності повідомлень, які постійно додаються, тобто журнал фіксації.

Повідомлення в розділі мають послідовний ідентифікаційний номер, який однозначно ідентифікує кожне повідомлення в розділі.

Розділи дозволяють журналу теми масштабуватись понад розмір, який підходить для одного сервера (брокера) і виступає одиницею паралелізму.

Розділи теми розподіляються по брокерам кластеру Kafka, де кожен брокер обробляє дані та запитує про частку розділів.

Кожен розділ тиражується через налаштовану кількість брокерів, щоб забезпечити відмову від помилок.

Добре пояснено в цій статті: http://codeflex.co/what-is-apache-kafka/


Чи є розділ лише для балансу завантаження теми?
g10guang

1
@ g10guang: розділи допомагають паралельно також обробляти повідомлення.
mrsrinivas

Виправте мене, якщо я помиляюся, коли повідомлення, яке надсилає виробник і коли воно надходить у тему, воно копіює його на розділи відповідно до конфігурацій, а потім споживач споживає його. Правильно?
Атул

1
@Atul це повідомлення буде додано до 1 з розділів для цієї теми відповідно до поточної конфігурації Partitor (за замовчуванням хеш ключа повідомлення визначає, до якого розділу йде повідомлення), і так, споживач підбере це повідомлення як він споживає повідомлення з цього розділу
Кевін Гук

@Kevin Hooke, дякую за пояснення та прояснив своє розуміння.
Атул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.