Модуль, позволяющий запустить celery-worker внутри Yandex Cloud Serverless Container.
Классический подход с отдельно запущенным воркером
- Бекенд отправляет задачу в очередь.
- Отдельный процесс воркера забирает задачу из очереди и выполняет ее.
Serverless-подход
В Serverless подходе предполагается, что нет никаких запущенных постоянно процессов приложения. Эти процессы запускаются либо по запросу пользователя, либо по различным тригерам облаком.
Модуль celery-yandex-serverless
помогает запустить воркер следующим образом:
- Бекенд отправляет задачу в очередь
- После попадания задачи в очередь срабатывает триггер, который делает http-запрос serverless-контейнеру.
- Serverless-контейнер запускает код задачи, который ранее выполнялся в воркере.
- Перейдите на страницу каталога в Яндекс.Облаке
- Зайдите в раздел Сервисные аккаунты
- Посмотрите название сервисного аккаунта в каталоге Яндекс.Облака
- Сгенерируйте
ACCESS_KEY
иSECRET_KEY
с помощью команды (заменитеSERVICE_ACCOUNT_NAME
на название сервисного аккаунта):
yc iam access-key create --service-account-name SERVICE_ACCOUNT_NAME
Команда вернет следующую информацию. Сохраните ее, она пригодится в будущем.
access_key:
id: aje...
service_account_id: aje...
created_at: "2023-03-24T17:49:01.555836400Z"
key_id: YCAJ... # <- Это access key
secret: YCPM... # <- Это secret key
Укажите переменные окружения с использованием только что полученных данных:
AWS_ACCESS_KEY_ID="access key, скопированный выше"
AWS_SECRET_ACCESS_KEY="secret key, скопированный выше"
AWS_DEFAULT_REGION="ru-central1"
CELERY_BROKER_URL=sqs://message-queue.api.cloud.yandex.net:443
CELERY_BROKER_IS_SECURE=True
В файле settings.py
укажите:
CELERY_BROKER_URL = os.environ.get("CELERY_BROKER_URL")
CELERY_BROKER_TRANSPORT_OPTIONS = {
'is_secure': os.environ.get("CELERY_BROKER_IS_SECURE", 'false').lower() == 'true'
}
После этого отправьте celery-задачу, чтобы в Яндекс.Облаке появилась очередь.
pip install celery-yandex-serverless
- установите модуль- В urls.py (
projectname
замените на название проекта):
from django.urls import path
from celery_yandex_serverless.django import worker_view_factory
from projectname.celery import app
urlpatterns = [
# другие адреса...
path("worker/<str:key>/", worker_view_factory(app)),
]
- Установите переменную окружения
CELERY_YANDEX_SERVERLESS_KEY
со случайным ключом. Он предотвратит нежелательные запуски воркеров по прямому обращению к URL.
В консольной команде ниже сделайте замены и выполните ее:
YANDEX_MESSAGE_QUEUE_ARN
- ARN очереди (можно увидеть на странице очереди)SERVICE_ACCOUNT_NAME
- название сервисного аккаунтаSERVERLESS_CONTAINER_NAME
- название serverless-контейнераCELERY_YANDEX_SERVERLESS_KEY
- ключ, созданный ранее
yc serverless trigger create message-queue \
--name celery \
--queue YANDEX_MESSAGE_QUEUE_ARN \
--queue-service-account-name SERVICE_ACCOUNT_NAME \
--invoke-container-name SERVERLESS_CONTAINER_NAME \
--invoke-container-service-account-name SERVICE_ACCOUNT_NAME \
--invoke-container-path /worker/CELERY_YANDEX_SERVERLESS_KEY \
--batch-size 1 \
--batch-cutoff 10s
Добавьте в settings.py
:
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"loggers": {
"celery_yandex_serverless.django": {
"level": "INFO",
},
},
}
Уровни:
INFO
- инфорация о начале и окончании обработки задачиDEBUG
- печать содержимого аргументов celery-таска
poetry version ...
- обновить версию- закомитить изменения
git tag ...
- добавить тег с версией пакетаgit push --tags
- запушить тегpoetry publish --build
- опубликовать пакет
Лицензия MIT.