Кафка выполняет балансировку разделов для каждого потока потребителей? - PullRequest
0 голосов
/ 15 января 2019

У меня есть кластер Kafka с несколькими темами, я собираюсь установить один раздел для каждой темы, и все эти темы будут использоваться одним экземпляром EC2, работающим с 3 потоками Kafka Consumer (по одному потребителю на поток), принадлежащими к той же Consumer Group.

Я еще не экспериментировал с этим, но мне интересно, может ли Кафка сбалансировать разделы всех тем, чтобы они были одинаково использованы 3 потоками? или Kafka назначит все разделы для использования только одним потоком?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

Из документации https://kafka.apache.org/0100/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#multithreaded:

1. Один потребитель на тему

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

  • PRO: проще всего реализовать
  • PRO: он часто самый быстрый, поскольку не требуется межпоточная координация
  • PRO: очень легко реализовать обработку заказов для каждого раздела (каждый поток обрабатывает сообщения только в том порядке, в котором он их получает).
  • CON: Чем больше потребителей, тем больше TCP-соединений с кластером (по одному на поток). В общем, Кафка очень эффективно обрабатывает соединения. небольшая стоимость.
  • CON: несколько потребителей означают, что больше запросов отправляется сервер и чуть меньше пакетирования данных, которые могут вызвать некоторые падение пропускной способности ввода / вывода.
  • CON: Общее количество потоков во всех процессах будет ограничено общим количеством разделов.

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

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

0 голосов
/ 16 января 2019

Не должно быть больше потребителя, чем разделов. В противном случае порядок сообщений не может быть гарантирован, и способ хранения потребительского смещения не будет работать. Частично из-за этого производители / потребители Kafka (Java) не являются поточно-ориентированными.

Таким образом, в случае Кафки число разделений - это ваш параллелизм.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...