JavaRush /Курси /Модуль 4: FastAPI /Використання Celery Beat для планування регулярних завдан...

Використання Celery Beat для планування регулярних завдань

Модуль 4: FastAPI
Рівень 13 , Лекція 7
Відкрита

У цій лекції поговоримо про Celery Beat — доповнення до Celery, яке дозволяє зручно створювати та планувати регулярні задачі. Якщо ти хоч раз замислювався, як автоматизувати виконання задач у твоєму застосунку за розкладом — будь то щотижнева відправка листів, видалення застарілих даних або регулярне оновлення звітів — ти потрапив туди, куди треба.

Celery Beat — це інструмент для планування задач в Celery. Він працює як "будильник" для твоїх задач, нагадуючи системі, що час виконати певну задачу у вказаний момент. Наприклад, якщо хочеш запускати задачу кожні 5 хвилин або щопонеділка о 8:00, Celery Beat зробить це без проблем.

Переваги використання Celery Beat

  • Простота налаштування розкладу (не потрібно писати складні планувальники).
  • Повна інтеграція з Celery, тобто твої задачі вже готові до використання.
  • Можливість динамічно змінювати розклад без перезапуску застосунку.

Як це працює?

Celery Beat зберігає розклад виконання задач у базі даних, читає його і відправляє задачі в Celery відповідно до вказаного часу.

Архітектурно це виглядає так:


Celery Beat Scheduler (читаємо розклад з БД) --> Відправляємо задачі в брокер (RabbitMQ/Redis) --> Celery Worker виконує задачі.

Встановлення і налаштування Celery Beat

Перш ніж насолоджуватися магією Celery Beat, його потрібно встановити і налаштувати.

Celery Beat можна встановити командою:

pip install django-celery-beat

Якщо працюєш з FastAPI, підхід той самий. Однак для Django це розширення з коробки адаптоване, тому багато готових фіч працюватимуть без додаткових танців.

  1. Додаємо застосунок Celery Beat:
    У settings.py додаємо django_celery_beat в список INSTALLED_APPS:
    
    INSTALLED_APPS = [
        ...
        'django_celery_beat',
    ]
    
  2. Застосовуємо міграції:
    Після додавання застосунку потрібно застосувати міграції. Celery Beat використовує таблиці в базі для збереження розкладу.
    python manage.py migrate
    
  3. Налаштовуємо конфігурацію Celery:
    У файл celery.py твого проекту додай наступний код:
    
    from celery import Celery
    
    app = Celery('your_project_name')
    
    # Налаштування з settings.py
    app.config_from_object('django.conf:settings', namespace='CELERY')
    
    # Автоматична реєстрація задач
    app.autodiscover_tasks()
    
    # Увімкнення Beat
    app.conf.beat_scheduler = 'django_celery_beat.schedulers.DatabaseScheduler'
    

    Ця настройка активує використання бази даних для збереження розкладу.

  4. Запуск Celery Beat:
    Щоб запустити Celery Beat, використовуй команду:
    celery -A your_project_name beat --loglevel=info
    

    Beat почне працювати як планувальник, перевіряючи розклад у базі даних.


Налаштування періодичних задач

Тепер, коли Celery Beat налаштований, давай створимо кілька задач, які будуть виконуватися за розкладом.

Приклад задачі у файлі tasks.py:


from celery import shared_task

@shared_task
def my_periodic_task():
    print("Це завдання виконується за розкладом!")

Додавання задачі в розклад через Django Admin

  1. Запусти сервер Django і зайди в адмін-панель.
  2. У секції "Periodic Tasks" натисни кнопку "Add".
  3. Заповни наступні поля:
    • Name: ім'я задачі (наприклад, "Привітання").
    • Task (вибір): обери задачу my_periodic_task з випадаючого списку.
    • Interval: вибери інтервал виконання задачі (наприклад, "Кожну 1 хвилину").
  4. Натисни "Зберегти".

Готово! Ти тільки-но створив задачу, яка буде виконуватися регулярно.


Приклади налаштування розкладу

Celery Beat підтримує два типи інтервалів для налаштування задач: Interval Schedule і Crontab Schedule.

Interval Schedule використовується, коли хочеш виконувати задачу через певні проміжки часу.

Приклад: задача виконується кожні 10 хвилин.

  1. У Django Admin зайди в "Interval Schedules".
  2. Додай новий інтервал:
    • Every: 10
    • Period: хвилин
  3. Признач цю інтервал для Periodic Task.

Crontab Schedule — більш гнучкий спосіб, коли треба вказати точний час або дні. Наприклад, "кожен понеділок о 9:00".

Приклад налаштування:

  1. У Django Admin зайди в "Crontab Schedules".
  2. Створи новий Crontab:
    • Minute: 0
    • Hour: 9
    • Day of week: 1 (понеділок)
    • Month of year: *
  3. Признач цей Crontab для Periodic Task.
Підказка:

Якщо забув синтаксис Crontab, скористайся crontab.guru — зручним інструментом для тестування розкладу.


Приклади налаштування в FastAPI

Якщо працюєш з FastAPI, то Celery Beat теж можна використовувати. Основний принцип залишається той самий: задачі Celery реєструються і підключаються до планувальника з використанням Crontab або Interval.

Приклад задачі:


from celery import Celery

celery_app = Celery('my_project', broker='redis://localhost')

@celery_app.task
def welcome_task():
    print("Привіт від задачі Celery у FastAPI!")

Задачі налаштовуються аналогічно Django — через базу даних. Різниця лише в тому, як інтегрувати інтерфейс (наприклад, через REST).


Моніторинг виконання задач

Для моніторингу виконання задач після їх планування можна використовувати Celery Flower.

Якщо пропустив це в попередніх лекціях, невелике нагадування:

Встанови Flower через pip:

pip install flower

Запусти Flower для твого проєкту:

celery -A your_project_name flower --port=5555

Flower дає веб-інтерфейс, де можна відслідковувати виконання задач і їх статус.


Практичні приклади планування задач

1. Видалення старих даних з бази


@shared_task
def delete_old_entries():
    from my_app.models import MyModel
    MyModel.objects.filter(created_at__lt=datetime.now()-timedelta(days=30)).delete()

Налаштуй Crontab для щотижневого виконання цього завдання.

2. Відправка щомісячних звітів


@shared_task
def send_monthly_report():
    print("Щомісячний звіт відправлено!")

Налаштуй Crontab для виконання у перший день кожного місяця.


Minute: 0
Hour: 9
Day of month: 1

3. Оновлення даних з API


@shared_task
def update_data_from_api():
    # Логіка оновлення з API
    print("Дані успішно оновлено!")

Налаштуй Interval Schedule для виконання кожні 12 годин.


Додаткові ресурси

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ