Гайды
Celery Beat: периодические задачи
Расписание в коде, crontab, django-celery-beat, часовые пояса, перекрытие запусков и чек-лист эксплуатации.
~9 мин чтения
Celery Beat: периодические задачи
Celery Beat — планировщик, который по расписанию кладёт задачи в те же очереди, что и обычные вызовы. Базовая настройка Celery — распределённые очереди; наблюдаемость — Flower.
1. Зачем Beat
- Ежедневные отчёты, очистка данных, синхронизация с внешним API.
- Альтернатива cron на одном сервере — распределённый beat с одним активным планировщиком при использовании django-celery-beat или redbeat.
2. Простое расписание в коде
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, # секунды
},
}
Запуск:
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