Создавайте динамические задачи по времени или одноразовые задачи на своем внутреннем сервере.

Содержание

  1. Почему Celery, Celery Beat, Django и Redis?
  2. Создание задач и расписаний в Django
  3. Настройка Celery и Celery Beat в Django и Linux.
  4. Настройка Celery, Celery Beat и Redis в Linux
  5. Мониторинг и тестирование задач

Почему Celery, Celery Beat, Django и Redis?

Celery — это асинхронная система выполнения задач, с помощью которой можно планировать запуск задач/функций в определенное время.

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

Celery нуждается в брокере сообщений/службе очередей как обязательное требование. Это может быть либо база данных вашего сервера, например PostgreSQL/SQLite, либо брокер сообщений, например Redis. Использование PostgreSQL не рекомендуется для крупных проектов, поскольку, поскольку Celery периодически запрашивает вашу основную базу данных, это может привести к большим задержкам и проблемам с пропускной способностью ваших API.
Отделение рабочей базы данных от брокера сообщений дает два преимущества:

  1. Уменьшите нагрузку на базу данных и увеличьте скорость ответа API.
  2. Индивидуальное масштабирование для сервера Redis или сервера PostgreSQL.

Поэтому я использовал Redis в своей архитектуре. Redis — хороший вариант для начинающих, поскольку его очень легко настроить и он пользуется широкой поддержкой сообщества. Redis — это список, в котором хранятся типы данных, аналогичные тем, которые могут храниться в форматах JSON. Это просто сервер хранения данных, который можно использовать для ускорения работы вашей серверной части.

Celery Beat — это пакет Python, созданный на основе пакета Celery, который обеспечивает подключение к панели администратора Django. Celery Beat не является обязательным для разработки, он используется, потому что мы можем отслеживать, создавать и удалять запланированные задачи непосредственно из панели администратора Django без необходимости использовать сервер Linux и соответствующие команды.

Django используется, потому что я опытный разработчик Python и могу кодировать на Python очень быстро и оптимизированно, уделяя особое внимание использованию лучших практик сообщества и контекстных.

Создание задач и расписаний в Django

Как старший разработчик, я не тестирую свой код до тех пор, пока не настрою и не запрограммирую всю функцию. Потому что тестирование на каждом этапе проекта приведет к пустой трате времени и ресурсов. С уверенностью нам нужно протестировать в конце.

  1. Создайте файл Tasks.py в каталоге приложения. Проект Django имеет несколько приложений, поэтому написание задач для приложения требует от нас следовать рекомендациям по структуре проекта и создать файл Tasks.py внутри папки приложения. Вот как выглядит моя иерархия файлов и папок:

Я создал tasks.py внутри приложения для встреч, поскольку задачи связаны с логикой встреч. Затем создайте задачи, используя декоратор @shared_task из пакета celery. Я создал три задачи, которые будут запланированы.

2. Создавайте периодические задачи внутри любого файла, который вам нравится. Я предпочитаю писать всю вспомогательную логику в файле helpers.py внутри приложения.

Важные моменты, которые следует помнить:

  1. Задачи хранятся в формате JSON внутри очереди сообщений Redis, поэтому нам необходимо преобразовать аргументы в формат JSON. Простые объекты int автоматически преобразуются внутренним кодировщиком, а строки — нет. Это странное поведение, но нам нужно преобразовать строки в объекты JSON, поэтому я сделал json.dumps() для всего списка аргументов.
  2. one_off flag равен True следовательно, задачи выполняются только один раз и автоматически помечаются как отключенные Celery. Определенный выше интервал игнорируется и не имеет значения.

Настройка Celery и Celery Beat в Django

  1. Приложение celery должно запускаться при запуске сервера Django, поэтому мы создаем файл celery.py на уровне папки настроек проекта, а также включаем приведенный ниже код в каталог проекта/проекта на уровне папки настроек. Мы также добавляем следующий код в файл __init__.py.

__init__.py

from .celery import app as celery_app
__all__ = ('celery_app',)

Сельдерей.py

import os
from celery import Celery
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings.dev')
app = Celery('ProjectName')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django apps.
app.autodiscover_tasks()
@app.task(bind=True, ignore_result=True)
def debug_task(self):
 print(f'Request: {self.request!r}')

Затем мы настраиваем наш файл settings.py для добавления установленных приложений и переменных конфигурации Celery.

INSTALLED_APPS = [
.
.
    'django_celery_beat',
]
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
CELERY_BROKER_URL = 'redis://127.0.0.1:6379'

Порт и IP-адрес брокера предназначены для Redis, работающего на серверах Linux. Это фиксированный порт, который Linux предоставляет Redis.

Настройка Celery, Celery Beat и Redis в Linux.

Мы устанавливаем пакеты celery, celery_beat в нашу виртуальную среду Python, чтобы Python мог подключаться к Celery и ставить задачи в очередь через своих воркеров.
Django не вставляет задачи напрямую в Redis. Вместо этого Django ставит задачи в очередь в Celery, а затем Celery отправляет эти задачи брокеру Redis. Работники Celery читают задачи из очереди Redis и выполняют их. Эта архитектура позволяет четко разделить задачи и эффективно управлять асинхронными задачами, делая ваше приложение Django более отзывчивым и масштабируемым.

  1. Установите и настройте сервер Redis:
sudo apt update
sudo apt install redis-server

2. Запуск службы Redis в качестве фонового демона:

sudo systemctl restart redis.service
sudo systemctl status redis

3. Измените файл redis.conf, чтобы сервер Redis запускался при загрузке системы:

sudo nano /etc/redis/redis.conf

Измените x на t y

4. Установка пакетов Python для celery, celery-beat и redis.

pip install celery
pip install django-celery-beat
pip install redis

5. После запуска сервера Django необходимо выполнить миграцию моделей ритма сельдерея.

python3 manage.py runserver 0.0.0.0:8000 --settings={project_name}.settings.local
python manage.py migrate — settings={project_name}.settings.local

6. Запуск Celery и Celery-Beat на отдельных экранах (быстрый, но наивный подход)

celery -A project.celery:app worker -l info
celery -A project.celery:app beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler

(Профессиональный подход) Запуск серверов Celery и Celery Beat от имени Deamon:

  1. Создание переменных среды, чтобы служебные файлы как для Celery, так и для Celery-Beat могли их использовать.
sudo vi /etc/default/celery

Содержимое файла среды

CELERYD_NODES="worker1"

CELERY_BIN="/home/ubuntu/project/venv/bin/celery"

CELERY_APP="location of the celery.py file in project where "app" is defined "

CELERYD_LOG_LEVEL=INFO

CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"

# Workers should run as an unprivileged user.
#   You need to create this user manually (oriyou can choose
#   a user/group combination that already exists (e.g., nobody).
CELERYD_USER="ubuntu"
CELERYD_GROUP="ubuntu"

 # If enabled pid and log directories will be created if missing,
 # and owned by the userid/group configured.
 CELERY_CREATE_DIRS=1

 # Options for Celery Beat
CELERYBEAT_PID_FILE="/var/run/celery/beat.pid"
CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"

2. Создание служебных файлов:

sudo vi /etc/systemd/system/celerybeat.service
sudo vi /etc/systemd/system/celery.service

3. Содержимое файла celery.service:

[Unit]
Description=Celery Service
After=network.target

[Service]
Type=forking
User=ubuntu
Group=ubuntu
EnvironmentFile=/etc/default/celery
WorkingDirectory=/home/ubuntu/project/project-backend
ExecStart=/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi start $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}"'
ExecReload=/bin/sh -c '${CELERY_BIN} -A $CELERY_APP multi restart $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'

[Install]
WantedBy=multi-user.target

4. Содержимое файла celerybeat.service

[Unit]
Description=Celery Service
After=network.target

[Service]
Type=simple
User=ubuntu
Group=ubuntu
EnvironmentFile=/etc/default/celery
WorkingDirectory=/home/ubuntu/project/project-backend
ExecStart=/bin/sh -c '${CELERY_BIN} -A ${CELERY_APP} beat  \
    --pidfile=${CELERYBEAT_PID_FILE} \
    --logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'
[Install]
WantedBy=multi-user.target

5. Проверка журналов ошибок службы сельдерея:

journalctl -xeu celeryd.service

6. [ВАЖНО] Перезагрузка Service Deamon после каждого изменения .service-файла.

systemctl daemon-reload

7. Создание файлов var/run и var/log для сельдерея, папка журнала содержит журналы для каждого работника Celery. Эти папки будут использоваться сельдереем, поэтому нам нужно предоставить Ubuntu права на эти папки:

sudo mkdir /var/log/celery
sudo mkdir /var/run/celery
sudo chown -R ubuntu:ubuntu /var/log/celery
sudo chown -R ubuntu:ubuntu /var/run/celery

Краткое описание всего процесса настройки в Linux:

  1. Сначала настройте Redis.
  2. Затем установите пакеты Python и запустите миграцию.
  3. Установите и настройте Celery и Celery Beat Deamons через служебные файлы.

Протестируйте код с помощью администратора Django или через API, который может создавать задачи. Тестирование зависит от контекста. Я протестировал архитектуру следующим образом:

  1. Проверьте журналы сельдерея на наличие инструкций по сохранению задач.
  2. Проверьте очередь Redis в Linux, чтобы убедиться, что задачи поставлены в очередь правильно.
  3. Проверьте результаты выполнения задачи вручную или с помощью таких пакетов, как celery_results.

Что делать теперь?

Если вы узнали что-то новое, пожалуйста, аплодируйте и следуйте за мной. Ваша поддержка ценится!

На простом английском языке

Спасибо, что вы являетесь частью нашего сообщества! Прежде чем уйти: