#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 вида шаблонов обмена сообщениями:
- Общая очередь: все потребители подписываются на одну единственную очередь сообщений. Каждый потребитель конкурирует друг с другом, и для каждого сообщения его получит только один потребитель.
- Публикация-подписка: каждое сообщение транслируется всем подписанным потребителям. Таким образом, все потребители получат одно и то же сообщение.
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, но он находится в другой группе, поэтому здесь копия всего сообщения также отправляется этому потребителю