Гайды

Celery Beat: периодические задачи

Расписание в коде, crontab, django-celery-beat, часовые пояса, перекрытие запусков и чек-лист эксплуатации.

~9 мин чтения

Celery Beat: периодические задачи

Celery Beat — планировщик, который по расписанию кладёт задачи в те же очереди, что и обычные вызовы. Базовая настройка Celery — распределённые очереди; наблюдаемость — Flower.


1. Зачем Beat

  • Ежедневные отчёты, очистка данных, синхронизация с внешним API.
  • Альтернатива cron на одном сервере — распределённый beat с одним активным планировщиком при использовании django-celery-beat или redbeat.

2. Простое расписание в коде

python
from celery.schedules import crontab

app.conf.beat_schedule = {
    "purge-sessions-daily": {
        "task": "proj.tasks.purge_old_sessions",
        "schedule": crontab(hour=3, minute=0),
    },
    "metrics-every-5m": {
        "task": "proj.tasks.push_metrics",
        "schedule": 300.0,  # секунды
    },
}

Запуск:

bash
celery -A proj.celery_app beat --loglevel=info

Отдельный процесс от worker.


3. crontab и solar

crontab(minute='*/15', hour='*', ...) — как в cron.
solar — привязка к восходу/закату (редко, но возможно).


4. Хранение расписания в БД (django-celery-beat)

Позволяет менять расписание без редеплоя, вести историю. Нужен общий database scheduler и один выделенный beat-лидер (или внешняя блокировка).


5. Часовые пояса

Явно задайте timezone в Celery и используйте aware datetime; избегайте смешения локального сервера и UTC.


6. Идемпотентность периодик

Задача может перекрыться со следующим запуском, если предыдущая ещё идёт. Решения: singleton lock (Redis SET key NX EX), expires на сообщении, увеличение интервала.


7. Распределённый лидер (RedBeat / k8s)

RedBeat хранит расписание в Redis с одним активным beat. В Kubernetes один реплика Deployment + readiness, либо sidecar с distributed lock — иначе два beat продублируют задачи.


8. Чек-лист

  • Beat и workers в разных unit'ах systemd/k8s.
  • Мониторинг «залипших» beat (нет heartbeat в логах).
  • Тесты: freeze time + вызов schedule вручную.
  • Не дублировать тяжёлую периодику на cron и beat одновременно без координации.
  • DST и переходы на летнее время — тестировать на критичных crontab.

Дальше: Celery: очереди · тег Celery