Большие задержки между обработкой двух последовательных пакетов кафки (с использованием потребителя ruby /karafka)
Я использую карафку, чтобы читать из темы, и звоню во внешнюю службу. Каждый вызов внешней службы занимает около 300 мс. А с 3 потребителями (3 модуля в k8s), работающими в группе потребителей, я ожидаю достижения 10 событий в секунду. Я вижу эти логи, которые также подтверждают ожидание 300 мс для обработки каждого отдельного события. Однако общая пропускная способность не складывается. Кажется, что каждый процесс karafka надолго застрял между обработкой двух пакетов событий.
Следуя инструментам вокруг
consume
метод подразумевает, что сам код потребителя не требует времени.
https://github.com/karafka/karafka/blob/master/lib/karafka/backends/inline.rb#L12
INFO Inline processing of topic production.events with 8 messages took 2571 ms
INFO 8 messages on production.events topic delegated to xyz
Однако я замечаю две вещи:
Когда я отслеживаю журналы на 3 модулях, кажется, что только один из 3 модулей генерирует журналы за раз. Для меня это не имеет смысла. Поскольку у всех разделов достаточно событий, и каждый потребитель должен иметь возможность работать с потребителем параллельно.
Хотя в приведенном выше сообщении примерно отображается 321 мс (2571/8) на событие, на самом деле я вижу, что журналы зависают на длительное время между обработкой двух пакетов. Мне любопытно, куда идет это время?
1 ответ
Вы можете столкнуться с несколькими проблемами. С моей стороны это немного догадывается без дополнительных подробностей, но давайте попробуем.
С точки зрения Кафки
Вы уверены, что равномерно распределяете данные по разделам? Может с одного раздела кушает?
Что вы здесь написали:
ИНФОРМАЦИЯ Встроенная обработка темы production.events с 8 сообщениями заняла 2571 мс.
Это указывает на то, что всего была обработана партия из 8 штук одним потребителем. Это может указывать на то, что данные распределяются неравномерно.
С точки зрения производительности
Есть два свойства производительности, которые могут повлиять на ваше понимание того, как работает Karafka: пропускная способность и задержка.
- Пропускная способность - это количество сообщений, которые могут быть обработаны за определенное время.
- Задержка - это время, которое проходит от момента создания сообщения до его обработки.
Насколько я понимаю, все сообщения производятся. Вы можете попробовать поиграть с настройками Karafka, в частности с этим: https://github.com/karafka/karafka/blob/83a9a5ba417317495556c3ebb4b53f1308c80fe0/lib/karafka/setup/config.rb#L114
С точки зрения регистратора
Используемый регистратор время от времени сбрасывает данные, поэтому вы увидите их не сразу, а через некоторое время. Вы можете проверить это, посмотрев время журнала.