Как масштабировать Celery workers горизонтально?
Подробный ответ
Как масштабируются исполнители
Celery позволяет запускать несколько процессов-исполнителей на одном сервере и несколько экземпляров на разных серверах или в контейнерах. Все они подключаются к одному брокеру и получают задачи из общих либо выделенных очередей.
Application
|
Broker
|
+------------------------+
| |
Celery executor 1 Celery executor 2
| |
Tasks from shared or separate queuesПараллелизм одного исполнителя
celery -A config worker -l info -c 4Параметр -c задаёт число одновременно выполняемых задач. Для вычислительно тяжёлых задач значение подбирают по числу CPU и памяти. Для задач, которые большую часть времени ожидают сеть или внешние сервисы, возможна большая параллельность, но нужно учитывать лимиты подключений и внешних API.
Разделение очередей
celery -A config worker -Q high -c 4 -n high@%h -l info
celery -A config worker -Q default -c 4 -n default@%h -l info
celery -A config worker -Q reports -c 2 -n reports@%h -l infoОтдельные очереди и исполнители полезны для срочных уведомлений, обычных задач и долгих отчётов. Так тяжёлый экспорт не блокирует отправку письма с восстановлением пароля.
Предварительное получение задач
Исполнитель может заранее получить несколько задач из брокера. Слишком большое предварительное получение ухудшает равномерность: один исполнитель забирает много задач, а другие простаивают. Для долгих задач часто уменьшают настройку worker_prefetch_multiplier и используют подтверждение после выполнения.
app.conf.worker_prefetch_multiplier = 1
app.conf.task_acks_late = TrueАвтоматическое масштабирование
В контейнерной среде число исполнителей можно увеличивать по длине очереди, возрасту старейшей задачи, времени выполнения и загрузке CPU. Нельзя ориентироваться только на CPU: если задачи ждут внешние сервисы, CPU может быть низким при огромной очереди.
Ограничения зависимостей
Перед добавлением исполнителей нужно проверить, выдержат ли нагрузку база данных, Redis, RabbitMQ, внешний API, почтовый провайдер и файловое хранилище. Масштабирование потребителей без ограничений может просто перенести перегрузку на следующую зависимость.
Как ответить на собеседовании
Celery масштабируется запуском дополнительных исполнителей и увеличением параллелизма. Я разделяю очереди по критичности и типу задач, выделяю отдельные исполнители для долгих операций и контролирую предварительное получение задач. Автоматическое масштабирование строю по длине и возрасту очереди, но обязательно учитываю лимиты базы и внешних сервисов.
Оцени свой прогресс