Как Kafka транслирует множество групп потребителей

Я новичок в Kafka и буду благодарен за разъяснения по следующему случаю.

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

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

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

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


person ivan_d    schedule 17.04.2014    source источник


Ответы (4)


если есть 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 потоками. Каждый потребитель может одновременно использовать несколько потоков. Обратите внимание, что количество потоков и разделов здесь одинаковое. Если количество потоков превышает количество разделов, некоторые потоки не получат никаких сообщений, так как им не будут назначены какие-либо разделы.

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

person java_geek    schedule 15.12.2014
comment
Не знаю, почему этот ответ не был принят. Это описывает очень важный аспект для понимания отношения раздела / потребителя в Kafka. - person sutanu dalui; 31.12.2014
comment
Модераторы фактически удалили мой ответ, поскольку я разместил ссылку на свою статью, в которой это описано более подробно. Жаль, но именно так работает StackOverflow. - person java_geek; 05.01.2015
comment
Когда я прочитал, что каждый потребитель использует более одной потоковой модели, я не понял. Это было не так, просто было непонятно. Переписал себе вот так: - person NYCeyes; 09.04.2015
comment
Когда я прочитал вторую модель выше, мне было непонятно (не то чтобы это было неправильно). = :) Я переписал это про себя, подчеркнув, что «разные потребители в пределах одной группы потребителей не могут потреблять из одних и тех же разделов. Таким образом, ребалансировка - это действие по назначению некоторой коллекции разделов, которая предназначена исключительно для одного потребителя в группе потребителей; и другой набор перегородок для обслуживания исключительно следующего потребителя в группе; и так далее. Как уже упоминалось, один и тот же процесс применяется к потребителям из разных групп потребителей. Надеюсь, это толкование было правильным. - person NYCeyes; 09.04.2015

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

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

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

person gaganbm    schedule 02.05.2014
comment
Спасибо за ваш ответ. Я читал о концепции группы потребителей. Вот почему меня смущает утверждение одного потребителя на раздел, которое постоянно повторяется в документации без ссылки на группу потребителей. Особенно если я читал про смещение раздела. Наличие нескольких групп потребителей на тему предполагает несколько смещений на раздел темы. Не так ли? - person ivan_d; 23.05.2014
comment
Ваше утверждение Только один потребитель в группе потребителей может получить сообщение не совсем верно. Каждый раздел может использоваться только одним потребителем. Таким образом, если в группе потребителей есть несколько потребителей, они все равно могут получать данные из разных разделов. В этом весь смысл параллельного потребления с Кафкой - person java_geek; 15.12.2014
comment
@gaganbm Если у нас много разделов и много групп потребителей только с одним потребителем, каждая из которых, как Kafka масштабируется, когда файл. мы добавляем больше групп потребителей и количество разделов остается постоянным б. мы добавляем больше групп потребителей и добавляем больше разделов? Масштабирование является линейным или сублинейным? заранее спасибо - person Novemberland; 08.12.2018

Обычно существует 2 типа шаблонов обмена сообщениями:

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

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

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

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

person QiankunZ    schedule 11.09.2018

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

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

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

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

person vimalraj    schedule 20.12.2016