Может ли Kafka иметь динамическое количество потребителей?

Мы ищем новую платформу обмена сообщениями и сузили свой выбор до RabbitMQ или Kafka.

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

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

Так, например, мы можем запустить очередь, в которой вообще нет потребителей, а затем количество потребителей может вырасти до 30. Позже оно может вырасти до 5000 или более, а затем снова упасть до 3.

Мы не заботимся о порядке сообщений для этого конкретного варианта использования. Подходит ли Кафка для этого?

Кроме того, мы планировали поддерживать пул потоков-потребителей, чтобы рабочие могли захватывать одно сообщение и обрабатывать его. Таким образом, в пуле может быть 100 потребителей и только 20 рабочих. Возможно ли, что мы получим сообщения в других 80 потребителях, которые не используются в воркерах из-за буферизации отправки сообщений? Другими словами, доставляет ли Kafka сообщения потребителям до того, как они будут запрошены, как это делают некоторые системы обмена сообщениями?


person WickedElephant    schedule 24.10.2015    source источник


Ответы (1)


Да, kafka определенно может соответствовать вашим требованиям. У вас может быть множество производителей/потребителей. Если все ваши потребители находятся в одной группе потребителей, все сообщения будут равномерно распределены между всеми потребителями. Это также не проблема, если вы отключите / добавите новых потребителей, kafka сделает все за вас автоматически.

На ваш последний вопрос: потребители kafka основаны на вытягивании, поэтому потребитель обязан проверить, есть ли какие-то сообщения для обработки.

person codejitsu    schedule 24.10.2015
comment
Спасибо за ваш ответ. Это очень полезно. Вы говорите, что все сообщения будут распределяться между всеми потребителями поровну, но что, если один из потребителей будет очень медленно обрабатывать, а другие будут работать быстро? Будет ли стоять очередь в ожидании медленного? Это не было бы идеально. - person WickedElephant; 26.10.2015
comment
@WickedElephant Да, в этом случае возможно, что медленный потребитель замедляет группу потребителей. Но это в случае очень небольшого количества разделов (например 1 или 2). На самом деле между потребителями будут распределяться не сообщения, а партиции kafka. Поэтому, если у вас достаточно разделов, все потребители будут работать быстро. - person codejitsu; 26.10.2015
comment
Еще раз спасибо за ваш ответ. После некоторого рассмотрения я не знаю, сработает ли это для нас, потому что у нас нет возможности узнать, сколько разделов нам понадобится. И мы не можем добавлять/удалять разделы на лету по мере необходимости в kafka. Мы бы оказались в ситуации, когда у нас есть сообщения в разделах, у которых нет потребителей. Я понимаю, что это странный вариант использования, но кажется, что kafka не подходит для этого. - person WickedElephant; 26.10.2015