К содержанию

Wiki · Технологии разработки

Celery

Содержание 5 разделов

    Celery – это очередь фоновых задач для Python: приложение кладёт задание в брокер сообщений, а отдельные процессы-воркеры забирают его и выполняют вне запроса пользователя. Проект открытый, распространяется по лицензии BSD, на октябрь 2026 года стабильная ветка 5.6.

    Если перевести на язык заказчика, Celery отвечает за всё, что сайт делает «потом»: отправить письмо после заказа, собрать отчёт за квартал, сжать загруженные фотографии, выгрузить заказы в 1С. Пользователь нажал кнопку и сразу получил ответ, а работа идёт в фоне.

    Что случится, если обходиться без очереди

    Условный пример. Менеджер нажимает «Выгрузить заказы за год в Excel». Без очереди сервер собирает файл прямо в ответ на этот клик: страница крутится минуту, потом две, а потом веб-сервер обрывает запрос по таймауту, и менеджер видит ошибку 504 вместо файла. Он жмёт ещё раз, и теперь сервер собирает два одинаковых отчёта сразу.

    С рассылкой хуже. Если отправлять 20 000 писем в том же процессе, который отвечает посетителям, сайт тормозит у всех, пока идёт отправка. А если процесс упадёт на середине, никто не узнает, кому письмо ушло, а кому нет.

    С Celery сайт за доли секунды ставит задачу в очередь и отвечает: «Отчёт готовится, пришлём ссылку на почту». Воркер собирает файл столько, сколько нужно, и никого не задерживает.

    Схема выгрузки отчёта без очереди с ошибкой 504 и с очередью Celery, где задачу выполняет воркер в фоне
    Выгрузка отчёта с очередью и без

    Из чего состоит схема с Celery

    • Приложение: сайт на Django, Flask или FastAPI, которое создаёт задачу.
    • Брокер: хранит задачи, пока их не заберут. Сам Celery этим не занимается.
    • Воркеры: процессы, которые выполняют задачи. Их можно запустить несколько, в том числе на разных серверах.
    • Хранилище результатов: если приложению нужно знать, чем закончилась задача.
    • Celery beat: планировщик, который ставит задачи по расписанию, например каждую ночь в 3:00.

    В коде это выглядит так:

    @app.task
    def send_invoice(order_id):
        ...  # собрать счёт и отправить письмо
    
    send_invoice.delay(order_id)  # поставить в очередь

    RabbitMQ или Redis в роли брокера

    Документация Celery называет полностью поддержанными два брокера: RabbitMQ и Redis. Другие брокеры, например Amazon SQS, тоже подключаются, но поддерживают не все возможности Celery.

    БрокерКогда выбирают
    RedisRedis уже стоит в проекте как кэш, задач немного, проще поддерживать один сервис
    RabbitMQЗадач много, важна гарантированная доставка, через тот же брокер обмениваются сообщениями другие системы

    Поднимают всё это обычно в Docker: приложение, брокер и воркеры в отдельных контейнерах.

    Что проверить в проекте, где есть Celery

    Чек-лист проекта с Celery: повторы при сбое, защита от двойного выполнения, таймауты, лимиты времени, мониторинг и алерты
    Что проверить в проекте с Celery
    • Повторы при сбое. Внешний сервис может не ответить, и задачу нужно повторить с паузой. В Celery для этого есть автоматические повторы с растущим интервалом, но их надо включить для каждой задачи.
    • Двойное выполнение. При некоторых настройках, если воркер упал посреди работы, задача выполнится заново. Документация советует писать задачи так, чтобы повтор был безвреден: письмо не уходит второй раз, счёт не выставляется дважды.
    • Ограничение по времени. Задача, которая зависла на запросе к внешнему API, держит воркер. Нужны таймауты на запросы и лимиты времени на сами задачи.
    • Мониторинг. Flower показывает в браузере воркеры и задачи в реальном времени, а команды celery inspect отвечают, что сейчас выполняется и что ждёт. Кто-то должен получать сигнал, если очередь растёт, а воркеры стоят.

    Ещё одна деталь: Celery не поддерживает Windows. Если разработчик собирается запускать воркеры на Windows-сервере, это повод задать вопросы до старта.

    Celery вместо cron, слежение за задачами и повторные запуски

    Чем Celery отличается от cron?

    Cron запускает скрипт по расписанию и не знает, чем он закончился, а Celery принимает задачи от сайта в любой момент, раздаёт их воркерам, повторяет при сбое и показывает статус. Для задач по расписанию в Celery есть свой планировщик beat, поэтому cron в таком проекте часто не нужен вовсе.

    Как следить, что задачи Celery выполняются?

    Проще всего поставить Flower: это веб-интерфейс, где видно воркеры, очередь и ошибки задач. Плюс алерт на длину очереди в брокере.

    Почему задача Celery выполнилась дважды?

    Задача Celery выполняется повторно, когда сообщение не успело получить подтверждение: воркер упал или перезапустился в процессе, и брокер отдал задачу снова. Так бывает при настройке подтверждения после выполнения. Защита в самом коде: перед отправкой письма или выставлением счёта задача проверяет, не сделано ли это уже.

    Если долгие операции на сайте тормозят страницы или обрываются по таймауту, поможет доработка существующего сайта: вынесем рассылки, выгрузки и обработку файлов в фон и настроим наблюдение за очередью в технической поддержке.

    Источники

    • Celery: официальная документация, разделы Introduction to Celery, Tasks и Monitoring and Management Guide
    • Репозиторий celery/celery на GitHub и лицензия BSD

    См. также: Redis, Apache Kafka, Коды ответов сервера.

    Остались вопросы по теме «Celery»?

    Напишите нам в Telegram или MAX. Ответит специалист, который отвечает за эту тему, или руководитель проектов в рабочее время.

    Сергей ЧерняковОтвечает по темеСергей ЧерняковWeb-разработчик

    Посчитайте стоимость проекта за 2 минуты

    Калькулятор соберёт смету по нашим тарифам: сайт, дизайн, интеграции и поддержка.