Возможно ли масштабировать задачи потребителей по количеству разделов?

#apache-kafka #kafka-consumer-api

#apache-kafka #kafka-consumer-api

Вопрос:

У нас проблемы с производительностью у наших потребителей. Точнее, в разделе «ЧТО делается с сообщениями».

Обычно мы получаем файлы из 2000 строк, разбитые на 6000 событий Kafka.

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

Проблема в том, что для обработки потребителем каждого сообщения требуется до 6 секунд. Таким образом, весь файл обрабатывается примерно за 1 час.

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

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

Добавление новых разделов в раздел — это одно из решений, но существующие сообщения не будут автоматически перераспределяться, и нам нужно будет написать KS-app (или другой процесс). Это тоже возможно.

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

И помимо этого, может ли кто-нибудь объяснить, почему стратегия, используемая в Kafka (т. Е. Один потребитель, подключенный к выделенному разделу на долгое время), является правильным решением?

Я имею в виду, мы могли бы представить другие решения с большим количеством потребителей, чем разделов: потребитель получает сообщение, «отключается» от брокера, обрабатывает сообщение, и в течение этого времени другой потребитель может «подключиться» и получить сообщение из этого же раздела, «отключиться», обработать сообщение, и третий потребитель может подключиться и …….. (Один парень из команды сказал «Ху. Kafka не масштабируется. Мы не можем добавить больше потребителей «.)

Комментарии:

1. Если у вас 10 разделов и порядок должен быть сохранен, то нет способа увеличить параллелизм за пределы 10 потребителей. Может быть, порядок можно каким-то образом смягчить?

Ответ №1:

Возможно ли масштабировать задачи потребителей по количеству разделов?

Нет.

Проще говоря, разделение — это ваша единица измерения в Kafka. Если вам нужно обрабатывать на более высоком уровне параллелизма, тогда вам нужно больше разделов. Именно так разработан Kafka.

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

Вы также можете использовать KSQL, чтобы упростить это:

 CREATE STREAM foo_repartitioned 
  WITH (PARTITIONS=256) AS 
SELECT * FROM foo;
  

«Kafka не масштабируется. Мы не можем добавить больше потребителей.»

Вы можете добавить больше потребителей. Вам просто нужно заранее разработать свои темы с соответствующим уровнем разделов 😉