Понимание тем и разделов Кафки

185

Я начинаю изучать Kafka для решения корпоративных задач.

Во время моих чтений у меня возникли вопросы:

  1. Когда производитель создает сообщение - он укажет тему, в которую он хочет отправить сообщение, верно? Это заботится о разделах?
  2. Когда подписчик работает - он задает свой идентификатор группы, чтобы он мог быть частью кластера потребителей той же темы или нескольких тем, которые интересуют эту группу потребителей?
  3. У каждой группы потребителей есть соответствующий раздел на брокере или у каждого потребителя есть один?

  4. Являются ли разделы, созданные брокером, и поэтому не заботятся о потребителях?

  5. Поскольку это очередь со смещением для каждого раздела, отвечает ли потребитель, какие сообщения он хочет прочитать? Нужно ли сохранять его состояние?

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

Pinidbest
источник

Ответы:

162

На этот пост уже есть ответы, но я добавляю свой взгляд с несколькими фотографиями из Kafka Definitive Guide

Прежде чем ответить на каждый вопрос, давайте добавим обзор компонентов производителя:

обзор компонентов производителя

1. Когда производитель создает сообщение - он укажет тему, в которую он хочет отправить сообщение, верно? Это заботится о разделах?

Производитель определит целевой раздел для размещения любого сообщения, в зависимости от:

  • Идентификатор раздела, если он указан в сообщении
  • ключ% num разделов , если не указан идентификатор раздела
  • Циклический перебор, если в сообщении нет ни идентификатора раздела, ни ключа сообщения, то есть доступно только значение

2. Когда подписчик работает - определяет ли он свой идентификатор группы, чтобы он мог быть частью группы потребителей той же темы или нескольких тем, которые интересуют эту группу потребителей?

Вы всегда должны настраивать group.id, если вы не используете простой API назначения и вам не нужно хранить смещения в Kafka. Он не будет частью какой-либо группы. источник

3. У каждой группы потребителей есть соответствующий раздел на брокере или у каждого потребителя есть один?

В одной группе потребителей каждый раздел будет обрабатываться только одним потребителем . Это возможные сценарии

  • Количество потребителей меньше количества тематических разделов, тогда одному из потребителей в группе может быть назначено несколько разделов. количество потребителей меньше тематических разделов
  • Количество потребителей такое же, как количество тематических разделов, тогда отображение разделов и потребителей может быть таким, как показано ниже, количество потребителей совпадает с количеством тематических разделов
  • Количество потребителей больше, чем количество тематических разделов, тогда распределение между разделами и потребителями может быть таким, как показано ниже. Неэффективно, проверьте Consumer 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(начните обрабатывать новые сообщения), потому что все сообщения истекли к тому времени, и хранение - конфигурация уровня темы.

mrsrinivas
источник
5
Здравствуй ! Я являюсь автором принятого ответа, но я думаю, что ваш ответ тоже очень хорош, особенно в пункте 3, где диаграммы проясняют ситуацию на 200%! Как вы думаете, мы должны слить?
C4stor
Я имел в виду, что я (или вы) могли бы включить элементы вашего ответа в свой, чтобы сделать их более заметными и улучшить этот (в настоящее время) лучший ответ. Но я бы не стал это делать без вашего согласия!
C4stor
Почему нельзя сопоставить мультипотребителя с разделом? Чтобы сообщение просто обрабатывалось один раз? Спасибо за ваш ответ.
g10guang
1
@ g10guang: Это связано с трудностями в обслуживании смещения коммитов .
mrsrinivas
1
Еще один сценарий. Вы можете иметь ОДИН раздел и НЕСКОЛЬКО потребителей, подписанных / назначенных на него. Брокер доставит записи только первому зарегистрированному потребителю. Но давайте предположим, что первому потребителю для обработки задачи требуется больше времени, чем интервалу опроса. Рекордное потребление не передается брокеру. Брокер понимает, что потребитель тусуется. В этом состоянии брокер запускает перебалансировку, отправляя новые назначенные разделы всем своим потребителям. Сообщение снова используется другим пользователем, хотя оно все еще обрабатывается C1. Быть осторожен.
Рубен Даддарио
127

Давайте все по порядку :)

1 - Когда продюсер создает сообщение - он укажет тему, в которую он хочет отправить сообщение, верно? Это заботится о разделах?

По умолчанию производитель не заботится о разбиении. У вас есть возможность использовать настраиваемый разделитель для лучшего контроля, но это совершенно необязательно.


2 - Когда подписчик работает - Указывает ли он свой идентификатор группы, чтобы он мог быть частью группы потребителей той же темы или нескольких тем, которые интересуют эту группу потребителей?

Да, потребители присоединяются (или создают, если они одни) к группе потребителей, чтобы разделить нагрузку. Никакие два потребителя в одной группе никогда не получат одно и то же сообщение.


3 - У каждой группы потребителей есть соответствующий раздел на брокере, или у каждого потребителя есть один?

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


4 - Являются ли разделы, созданные брокером, следовательно, не заботой для потребителей?

Это не так, но вы можете видеть из 3, что абсолютно бесполезно иметь больше потребителей, чем существующих разделов, так что это ваш максимальный уровень параллелизма для потребления.


5 - Поскольку это очередь со смещением для каждого раздела, отвечает ли потребитель, какие сообщения он хочет прочитать? Нужно ли сохранять его состояние?

Да, потребители сохраняют смещение для каждой темы на раздел. Это полностью обработано Кафкой, не беспокойтесь об этом.


6 - Что происходит, когда сообщение удаляется из очереди? - Например: удержание было в течение 3 часов, затем проходит время, как обрабатывается смещение с обеих сторон?

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

C4stor
источник
3
Sry :) Немного сложно объяснить весь процесс kafka в блоках по 500 символов, я предлагаю прочитать kafka.apache.org/documentation.html#theconsumer (и, вероятно, оставшуюся часть 4, о внутренних компонентах kafka ). В основном: потребители запрашивают сохранение смещений, но они сохраняются в другом месте.
C4stor
Я только что прочитал это, и все же это не объясняет, где он находится: Кафка обрабатывает это по-другому. Наша тема разделена на набор полностью упорядоченных разделов, каждый из которых потребляется одним потребителем в любой момент времени. Это означает, что позиция потребителя в каждом разделе - это всего лишь одно целое число, смещение следующего сообщения для потребления. Это делает состояние о том, что было израсходовано, очень мало, только один номер для каждого раздела. Это состояние может периодически проверяться. Это делает эквивалент подтверждения сообщений очень дешевым.
Pinidbest
20

Кафка использует концепцию Тема, которая приходит, чтобы навести порядок в потоке сообщений.

Чтобы сбалансировать нагрузку, тема может быть разделена на несколько разделов и реплицирована между брокерами.

Разделы - это упорядоченные неизменяемые последовательности сообщений, которые постоянно добавляются, т.е. журнал фиксации.

Сообщения в разделе имеют последовательный идентификационный номер, который однозначно идентифицирует каждое сообщение в разделе.

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

Разделы темы распределены по посредникам в кластере Kafka, где каждый посредник обрабатывает данные и запрашивает долю разделов.

Каждый раздел реплицируется через настраиваемое количество посредников для обеспечения отказоустойчивости.

Хорошо объяснено в этой статье: http://codeflex.co/what-is-apache-kafka/

ybonda
источник
Раздел только для баланса нагрузки темы?
g10guang
1
@ g10guang: разделы помогают параллельно обрабатывать сообщения.
мсринивас
Пожалуйста, исправьте меня, если я ошибаюсь, когда сообщение, отправленное производителем, и когда оно приходит в тему, оно копирует его в разделы в соответствии с конфигурациями, а затем потребитель использует его. Правильно?
Атул
1
@Atul сообщение будет добавлено к 1 из разделов для этой темы в соответствии с текущей конфигурацией Partitioner (по умолчанию хэш ключа сообщения определяет, к какому разделу отправляется сообщение), и да, потребитель получит сообщение как он потребляет сообщения из этого раздела
Кевин Хук
@ Кевин Гук, спасибо за объяснение и прояснение моего понимания.
Атул