Создавайте динамические задачи по времени или одноразовые задачи на своем внутреннем сервере.
Содержание
- Почему Celery, Celery Beat, Django и Redis?
- Создание задач и расписаний в Django
- Настройка Celery и Celery Beat в Django и Linux.
- Настройка Celery, Celery Beat и Redis в Linux
- Мониторинг и тестирование задач
Почему Celery, Celery Beat, Django и Redis?
Celery — это асинхронная система выполнения задач, с помощью которой можно планировать запуск задач/функций в определенное время.
Celery — это отдельный процесс, который выполняется на машине, что означает, что он отделен от других компонентов архитектуры, что делает его масштабируемым.
Celery нуждается в брокере сообщений/службе очередей как обязательное требование. Это может быть либо база данных вашего сервера, например PostgreSQL/SQLite, либо брокер сообщений, например Redis. Использование PostgreSQL не рекомендуется для крупных проектов, поскольку, поскольку Celery периодически запрашивает вашу основную базу данных, это может привести к большим задержкам и проблемам с пропускной способностью ваших API.
Отделение рабочей базы данных от брокера сообщений дает два преимущества:
- Уменьшите нагрузку на базу данных и увеличьте скорость ответа API.
- Индивидуальное масштабирование для сервера Redis или сервера PostgreSQL.
Поэтому я использовал Redis в своей архитектуре. Redis — хороший вариант для начинающих, поскольку его очень легко настроить и он пользуется широкой поддержкой сообщества. Redis — это список, в котором хранятся типы данных, аналогичные тем, которые могут храниться в форматах JSON. Это просто сервер хранения данных, который можно использовать для ускорения работы вашей серверной части.
Celery Beat — это пакет Python, созданный на основе пакета Celery, который обеспечивает подключение к панели администратора Django. Celery Beat не является обязательным для разработки, он используется, потому что мы можем отслеживать, создавать и удалять запланированные задачи непосредственно из панели администратора Django без необходимости использовать сервер Linux и соответствующие команды.
Django используется, потому что я опытный разработчик Python и могу кодировать на Python очень быстро и оптимизированно, уделяя особое внимание использованию лучших практик сообщества и контекстных.
Создание задач и расписаний в Django
Как старший разработчик, я не тестирую свой код до тех пор, пока не настрою и не запрограммирую всю функцию. Потому что тестирование на каждом этапе проекта приведет к пустой трате времени и ресурсов. С уверенностью нам нужно протестировать в конце.
- Создайте файл Tasks.py в каталоге приложения. Проект Django имеет несколько приложений, поэтому написание задач для приложения требует от нас следовать рекомендациям по структуре проекта и создать файл Tasks.py внутри папки приложения. Вот как выглядит моя иерархия файлов и папок:
Я создал tasks.py
внутри приложения для встреч, поскольку задачи связаны с логикой встреч. Затем создайте задачи, используя декоратор @shared_task
из пакета celery. Я создал три задачи, которые будут запланированы.
2. Создавайте периодические задачи внутри любого файла, который вам нравится. Я предпочитаю писать всю вспомогательную логику в файле helpers.py внутри приложения.
Важные моменты, которые следует помнить:
- Задачи хранятся в формате JSON внутри очереди сообщений Redis, поэтому нам необходимо преобразовать аргументы в формат JSON. Простые объекты int автоматически преобразуются внутренним кодировщиком, а строки — нет. Это странное поведение, но нам нужно преобразовать строки в объекты JSON, поэтому я сделал
json.dumps()
для всего списка аргументов. one_off
flag равенTrue
следовательно, задачи выполняются только один раз и автоматически помечаются как отключенные Celery. Определенный выше интервал игнорируется и не имеет значения.
Настройка Celery и Celery Beat в Django
- Приложение 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 более отзывчивым и масштабируемым.
- Установите и настройте сервер 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:
- Создание переменных среды, чтобы служебные файлы как для 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:
- Сначала настройте Redis.
- Затем установите пакеты Python и запустите миграцию.
- Установите и настройте Celery и Celery Beat Deamons через служебные файлы.
Протестируйте код с помощью администратора Django или через API, который может создавать задачи. Тестирование зависит от контекста. Я протестировал архитектуру следующим образом:
- Проверьте журналы сельдерея на наличие инструкций по сохранению задач.
- Проверьте очередь Redis в Linux, чтобы убедиться, что задачи поставлены в очередь правильно.
- Проверьте результаты выполнения задачи вручную или с помощью таких пакетов, как celery_results.
Что делать теперь?
Если вы узнали что-то новое, пожалуйста, аплодируйте и следуйте за мной. Ваша поддержка ценится!
На простом английском языке
Спасибо, что вы являетесь частью нашего сообщества! Прежде чем уйти:
- Обязательно аплодируйте и следуйте за автором! 👏
- Еще больше контента вы можете найти на PlainEnglish.io 🚀
- Подпишитесь на нашу бесплатную еженедельную рассылку. 🗞️
- Следуйте за нами в Twitter(X), LinkedIn, YouTube и Discord.