Кафка: единая группа потребителей, без разделов и нескольких тем - PullRequest
0 голосов
/ 16 января 2020

У меня 22 темы, и порядок в топи c важен для меня. У меня нет разделов.
В основном у меня 11 арендаторов, и мне нужно две темы для каждого арендатора.
Меня не устраивает вопрос о том, иметь ли одну группу потребителей для всех 22 тем или 22 группы потребителей?
Нагрузка небольшая, потребление не в режиме реального времени, это автономный процесс, поэтому отставание в несколько миллисекунд не повредит.

Меня смущают следующие моменты:
1. Если у меня есть одна группа потребителей с одним потребителем, работающим на одноместном машина (JVM - Spring Boot Application), будет ли потребитель работать со всеми темами, используя один поток, или будет отдельный поток для каждой топи c? Если это один поток, поток может быть перегружен. Если есть несколько потоков, я смогу достичь параллелизма (использовать все ядра), не вращая другую машину.
2. Если у меня есть одна группа потребителей, слушающая все темы с множественным потребители, работающие на нескольких компьютерах (несколько JVM - Spring Boot Application), будет ли Zookeeper распределять нагрузку из разных тем на разные машины? Я понимаю, что сообщения от одного topi c всегда будут go на одну машину.

Например: если есть 2 потребителя (по одному на машину), одна группа потребителей прослушивает все 22 темы, и если 22 темы создают сообщения одновременно, будут ли они распределены между двумя машинами, может быть, что-то как сообщения от topi c 1-11 отправляются на первый компьютер, а topi c 12-22 отправляются на второй компьютер? Я просто заинтересован в распределении нагрузки.

Работает ли это таким образом (при условии равной загрузки всех тем)?
2 машины -> сообщения от примерно 11 тем на машину
4 машины -> сообщения от примерно 5 тем на машину и т. Д. на.

Ответы [ 2 ]

1 голос
/ 16 января 2020

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

В ответе используется один поток, поскольку Документация KafkaConsumer гласит:

Потребитель Kafka НЕ является поточно-ориентированным. Весь сетевой ввод / вывод происходит в потоке приложения, выполняющего вызов. Ответственность за правильную синхронизацию многопоточного доступа лежит на пользователе. Несинхронизированный доступ приведет к исключению ConcurrentModificationException.


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

Да, хотя за это не отвечает компонент Zookeeper.

Просто примечание: Кафка ничего не знает о машинах, он знает о группах потребителей и потребителях.


Теперь давайте ответим на главный вопрос.

Меня смущает вопрос, иметь ли одну группу потребителей для всех 22 тем или 22 группы потребителей?

Поскольку у вас есть только один раздел на топи c, наличие 22 потребителей с одинаковыми group.id или 22 потребителей, каждый из которых подписан только на одну топи c, - это то же самое, потому что:

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

1 голос
/ 16 января 2020

Прежде всего проясним понятия:

  • Топи c - это просто логическая единица.
  • Сообщения заказываются только в разделах.
  • "У меня нет разделов". это невозможно. У топи c должен быть хотя бы один раздел.
  • Группа потребителей используется только для горизонтальной масштабируемости. Если у вас 5 разделов в топи c и 5 потребителей в одной группе потребителей. Затем Kafka назначает каждый раздел потребителю, и процесс потребления работает параллельно.

Ответы на ваши вопросы:

  1. Если у вас есть один потребитель, тогда будет один поток ( Потребитель Kafka не является потокобезопасным), если вам нужен паралеллизм, вам нужно иметь более одного раздела в topi c и такое же количество потребителей в одной и той же группе потребителей. Потребитель может подписаться на несколько тем.
  2. Zookeeper не используется на стороне потребителя. (взгляните на this ) Но Kafka распределяет разделы среди потребителей равномерно. По умолчанию Kafka гарантирует справедливое распределение разделов между потребителями.

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

...