На этот пост уже есть ответы, но я добавляю свой взгляд с несколькими фотографиями из 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()
может быть полезно для управления смещением.
Подробнее о координаторе группы :
- Это один из избранных брокеров в кластере со стороны сервера Kafka.
- Потребители взаимодействуют с координатором группы для фиксации смещения и получения запросов.
- Потребитель периодически посылает пульс Координатору группы.
6. Что происходит, когда сообщение удаляется из очереди? - Например: удержание было в течение 3 часов, затем проходит время, как обрабатывается смещение с обеих сторон?
Если какой-либо потребитель запускается после периода хранения, сообщения будут потребляться в соответствии с возможной auto.offset.reset
конфигурацией latest/earliest
. технически это latest
(начните обрабатывать новые сообщения), потому что все сообщения истекли к тому времени, и хранение - конфигурация уровня темы.
Давайте все по порядку :)
По умолчанию производитель не заботится о разбиении. У вас есть возможность использовать настраиваемый разделитель для лучшего контроля, но это совершенно необязательно.
Да, потребители присоединяются (или создают, если они одни) к группе потребителей, чтобы разделить нагрузку. Никакие два потребителя в одной группе никогда не получат одно и то же сообщение.
Ни. Всем потребителям в группе потребителей назначается набор разделов при двух условиях: ни один из двух потребителей в одной группе не имеет общего раздела, а группе потребителей в целом назначается каждый существующий раздел.
Это не так, но вы можете видеть из 3, что абсолютно бесполезно иметь больше потребителей, чем существующих разделов, так что это ваш максимальный уровень параллелизма для потребления.
Да, потребители сохраняют смещение для каждой темы на раздел. Это полностью обработано Кафкой, не беспокойтесь об этом.
Если потребитель когда-либо запрашивает смещение, недоступное для раздела на брокерах (например, из-за удаления), он переходит в режим ошибки и в конечном итоге сбрасывает себя для этого раздела либо в самое последнее, либо в самое старое доступное сообщение (в зависимости от значение конфигурации auto.offset.reset) и продолжить работу.
источник
Кафка использует концепцию Тема, которая приходит, чтобы навести порядок в потоке сообщений.
Чтобы сбалансировать нагрузку, тема может быть разделена на несколько разделов и реплицирована между брокерами.
Разделы - это упорядоченные неизменяемые последовательности сообщений, которые постоянно добавляются, т.е. журнал фиксации.
Сообщения в разделе имеют последовательный идентификационный номер, который однозначно идентифицирует каждое сообщение в разделе.
Разделы позволяют журналу темы масштабироваться за пределы размера, который поместится на одном сервере (посреднике) и выступать в качестве единицы параллелизма.
Разделы темы распределены по посредникам в кластере Kafka, где каждый посредник обрабатывает данные и запрашивает долю разделов.
Каждый раздел реплицируется через настраиваемое количество посредников для обеспечения отказоустойчивости.
Хорошо объяснено в этой статье: http://codeflex.co/what-is-apache-kafka/
источник