Понимание тем и разделов Kafka

avatar
Pinidbest
25 июня 2016 в 02:58
110650
4
283

Я начинаю изучать Кафку, во время чтения у меня возникло несколько вопросов:

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

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

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

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

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

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

Источник

Ответы (4)

avatar
mrsrinivas
13 августа 2018 в 19:16
288

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

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

overview of producer components

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

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

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

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

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

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

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

  • Количество потребителей меньше чем количество разделов темы, тогда несколько разделов могут быть назначены одному из потребителей в группе number of consumers less than topic partitions
  • Количество потребителей то же, что и количество разделов темы, тогда сопоставление разделов и потребителей может быть таким, как показано ниже, number of consumers same as the number of topic partitions
  • Количество потребителей больше, чем количество разделов темы, тогда сопоставление разделов и потребителей может быть таким, как показано ниже, Неэффективно, проверьте Потребитель 5 number of consumers more than number of topic partitions

4. Поскольку разделы, созданные брокером, не беспокоят потребителей?

Потребитель должен знать количество разделов, как обсуждалось в вопросе 3.

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

KAFKA (чтобы быть конкретным Групповой координатор ) Ухаживает о смещении состояния, создавая сообщение для внутреннего ___ Compare_offsets Тема, это поведение может быть настраивается вручную, установив с enable.auto.commit значение false. В этом случае consumer.commitSync() и consumer.commitAsync() могут быть полезны для управления смещением.

Подробнее о координаторе группы:

  1. Это один из выбранных брокеров в кластере со стороны сервера Kafka.
  2. Потребители взаимодействуют с координатором группы для коммитов смещения и запросов на выборку.
  3. Потребитель периодически отправляет контрольные сигналы координатору группы.

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

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

C4stor
24 августа 2018 в 12:20
16

Привет ! Я автор принятого ответа, но я думаю, что ваш тоже очень хорош, особенно в пункте № 3, где диаграммы проясняют ситуацию на 200%! Как вы думаете, мы должны объединиться?

C4stor
24 августа 2018 в 16:35
0

Я имел в виду, что я (или вы) могли бы включить элементы вашего ответа в мой, чтобы сделать их более заметными и улучшить этот (в настоящее время) лучший ответ. Но я бы не стал этого делать без вашего согласия!

g10guang
13 ноября 2018 в 08:07
0

Почему нельзя сопоставить нескольких потребителей с разделом? Чтобы убедиться, что сообщение обрабатывается только один раз? Спасибо за ваш ответ.

mrsrinivas
13 ноября 2018 в 10:37
1

@ g10guang: Это из-за трудностей с обслуживанием смещения фиксации.

Ruben Daddario
25 сентября 2019 в 14:06
3

Другой сценарий. У вас может быть ОДИН раздел и НЕСКОЛЬКО потребителей, подписанных/назначенных на него. Брокер будет доставлять записи только первому зарегистрированному потребителю. Но предположим, что первому потребителю требуется больше времени для обработки задачи, чем интервал опроса. Потребление записи не передается брокеру. Брокер понимает, что потребитель завис. В этом состоянии брокер инициирует повторную балансировку, отправляя новые назначенные разделы всем своим потребителям. Сообщение снова потребляется другим потребителем, хотя оно все еще обрабатывается C1. Будь осторожен.

Nag
14 мая 2020 в 01:59
0

Это все еще действительно для kafka 2.1/kafka 2.5, где смещения будут храниться в kafka?

Deb
20 апреля 2021 в 09:47
0

«В одной группе потребителей каждый раздел будет обрабатываться только одним потребителем». - @mrsrinivas: Что касается этого утверждения, я думаю, что если у Consumer-Group есть только 1 Consumer, а CG подключена к Kafka Topic из нескольких разделов, то один потребитель должен иметь возможность подключаться к нескольким разделам.

mrsrinivas
20 апреля 2021 в 16:52
0

@Deb: это правда, один потребитель может читать несколько разделов. Я хотел сказать, что со стороны раздела одна часть будет обрабатываться одним потребителем только в CG. Пожалуйста, позвольте мне, если есть лучший способ объяснить это.

Deb
21 апреля 2021 в 01:59
0

понял @mrsrinivas

avatar
Shristi Bisht
2 июня 2021 в 13:27
0
  1. Когда производитель создает сообщение, он указывает тему, в которую он хочет отправить сообщение, верно? Он заботится о разделах?

Да, производитель указывает тему

producer.send(new ProducerRecord<byte[],byte[]>(topic,  partition, key1, value1) , callback);

Чем больше разделов в кластере Kafka, тем выше пропускная способность, которую можно достичь. Грубая формула для выбора количества разделов основана на пропускной способности. Вы измеряете все, что вы можете достичь в одном разделе для производства (назовем его p) и потребления (назовем его c).


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

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


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

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


  1. Разделы созданы посредником и, следовательно, не беспокоят потребителей?

Брокеры уже имеют разделы. Каждый брокер должен иметь до 4 000 разделов, а каждый кластер — до 200 000 разделов.

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

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


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

Смещение обрабатывается внутри Kafka. Текущее смещение — это указатель на последнюю запись, которую Kafka уже отправила потребителю в последнем опросе. Таким образом, потребитель не получит одну и ту же запись дважды из-за текущего смещения. Его не нужно указывать исключительно


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

Он автоматически перенастраивает себя в соответствии с необходимостью. Должно выдать ошибку.

avatar
ybonda
7 февраля 2018 в 14:25
25

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

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

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

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

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

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

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

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

g10guang
13 ноября 2018 в 08:04
1

Является ли раздел только для балансировки нагрузки темы?

mrsrinivas
21 января 2019 в 14:50
1

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

Atul
2 сентября 2019 в 11:57
0

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

Kevin Hooke
6 декабря 2019 в 00:46
1

@Atul сообщение будет добавлено к 1 из разделов для этой темы в соответствии с текущей конфигурацией Partitioner (по умолчанию хэш ключа сообщения определяет, в какой раздел отправляется сообщение), и да, Потребитель подберет сообщение как он потребляет сообщения из этого раздела

Atul
6 декабря 2019 в 03:58
0

@ Кевин Хук, спасибо за объяснение и разъяснение моего понимания.

avatar
C4stor
25 июня 2016 в 19:37
150

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

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

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


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

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


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

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


4. Разделы, созданные посредником, не беспокоят потребителей?

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


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

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


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

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

C4stor
28 июня 2016 в 08:22
3

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

Pinidbest
28 июня 2016 в 12:02
0

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