Как Кафка вещал многим Группам потребителей

#apache-kafka #apache-kafka-streams #publish-subscribe

#apache-kafka

Вопрос:

Я новичок в Кафке и буду очень признателен за разъяснения по следующему делу.

В документации Kafka говорится в параграфе «Позиция потребителя»:

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

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

Вопрос в том, как может происходить трансляция для многих групп потребителей, если только один потребитель может получить конкретное сообщение?

Ответ №1:

Только один потребитель в a consumer group может получить сообщение. Но все consumer groups получают сообщения.

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

Прочитайте Consumer раздел здесь.

Комментарии:

1. Спасибо за ваш ответ. Я читал о концепции группы потребителей. Вот почему меня смущает утверждение «один потребитель на раздел», которое постоянно повторяется в документации без ссылки на группу потребителей. Особенно, если я прочитаю о смещении раздела. Несколько групп потребителей для каждой темы предполагают несколько смещений для каждого раздела темы. Не так ли?

2. Ваше утверждение «Только один потребитель в группе consuemr может извлечь сообщение» не совсем верно. Каждый раздел может использоваться только одним потребителем. Таким образом, если в группе потребителей несколько потребителей, они все равно могут потреблять из разных разделов. В этом весь смысл параллельного потребления с Kafka

3. @gaganbm Если у нас много разделов и много групп потребителей, в каждой из которых есть только один потребитель, как Kafka масштабируется, когда a. мы добавляем больше групп потребителей, а количество разделов постоянно b. мы добавляем больше групп потребителей и добавляем больше разделов? Является ли масштабирование линейным или сублинейным? Заранее спасибо

4. @java_geek Утверждение в точности верно, потому что сообщение помещается в очередь только в один раздел, а не в более чем один раздел. И поэтому из поведения, которое вы описали в своем комментарии, следует, что сообщение может быть получено только одним потребителем в группе потребителей.

Ответ №2:

если есть 10 разделов для темы и 3 экземпляра потребителей (C1, C2, C3, запущенные в этом порядке), все принадлежащие к одной и той же группе потребителей, у нас могут быть разные модели потребления, которые допускают параллелизм чтения, как показано ниже

Каждый потребитель использует один поток. В этой модели, когда запускается C1, все 10 разделов темы отображаются в один и тот же поток, и C1 начинает потреблять из этого потока. Когда запускается C2, Kafka перебалансирует разделы между двумя потоками. Таким образом, каждый поток будет назначен 5 разделам (в зависимости от алгоритма перебалансировки это также может быть 4 против 6), и каждый потребитель потребляет из своего потока. Аналогично, при запуске C3 разделы снова перебалансируются между 3 потоками. Обратите внимание, что в этой модели при потреблении из потока, назначенного более чем одному разделу, порядок сообщений будет перемешиваться между разделами.

Каждый потребитель использует более одного потока (скажем, C1 использует 3, C2 использует 3, а C3 использует 4). В этой модели при запуске C1 все 10 разделов назначаются 3 потокам, и C1 может использовать 3 потока одновременно, используя несколько потоков. Когда запускается C2, разделы перебалансируются между 6 потоками, и аналогично, когда запускается C3, разделы перебалансируются между 10 потоками. Каждый потребитель может использовать одновременно из нескольких потоков. Обратите внимание, что количество потоков и разделов здесь равно. В случае, если количество потоков превышает количество разделов, некоторые потоки не получат никаких сообщений, поскольку им не будут назначены какие-либо разделы.

Если существует другая группа потребителей, тот же процесс применяется к потребителям внутри этой группы потребителей

Комментарии:

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

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

3. Когда я прочитал модель «Каждый потребитель использует более одного потока», мне было непонятно. Это не было неправильно, просто это было непонятно. Я переписал это для себя вот так:

4. Когда я прочитал вторую модель выше, мне было непонятно (не то, чтобы это было неправильно). =:) Поэтому я переписал это для себя, подчеркнув, что «Разные потребители в одной и той же группе потребителей не могут использовать одни и те же разделы. Таким образом, перебалансировка — это процесс назначения некоторой коллекции разделов, которая предназначена исключительно для одного потребителя в группе потребителей; и другая коллекция разделов для обслуживания исключительно следующего потребителя в группе; и так далее. Как уже упоминалось, «один и тот же процесс применяется к потребителям в разных группах потребителей». Я надеюсь, что эта интерпретация была правильной.

Ответ №3:

Как правило, существует 2 вида шаблонов обмена сообщениями:

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

Kafka поддерживает их обоих одновременно с помощью концепции группы потребителей. Потребители в одной группе следуют шаблону общей очереди. Только один потребитель в группе может получить сообщение.

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

Полезная ссылка: https://dzone.com/articles/dont-use-apache-kafka-consumer-groups-the-wrong-wa

Ответ №4:

Хороший вопрос.введите описание изображения здесь

Возьмем пример, у меня есть тема под названием жалоба, имеющая два раздела p1, p2

теперь у меня есть две группы потребителей, называемые group1, имеющие двух потребителей c1 и c2, и group2, потребляющие c3

здесь я направляю сообщения с p1 на c1, а p2 — на c2, и я подписался на другого потребителя с именем c3, но он находится в другой группе, поэтому здесь копия всего сообщения также отправляется этому потребителю