PRO

Как масштабировать Celery workers горизонтально?

Горизонтальное масштабирование Celery означает запуск дополнительных исполнителей задач на нескольких процессах или серверах. Для устойчивой работы нужно разделять очереди по типам нагрузки, ограничивать параллелизм, следить за числом подключений, возрастом задач и не допускать, чтобы долгие задачи блокировали срочные.
Подробный ответ

Как масштабируются исполнители

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 масштабируется запуском дополнительных исполнителей и увеличением параллелизма. Я разделяю очереди по критичности и типу задач, выделяю отдельные исполнители для долгих операций и контролирую предварительное получение задач. Автоматическое масштабирование строю по длине и возрасту очереди, но обязательно учитываю лимиты базы и внешних сервисов.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге