Package: celery-yandex-serverless
Celery Yandex ServerlessМодуль, позволяющий запустить celery-worker внутри Yandex Cloud Serverless Container.Классический подход с отдельно запущенным воркеромБекенд отправляет задачу в очередь.Отдельный процесс воркера забирает задачу из очереди и выполняет ее.Serverless-подходВ Serverless подходе предполагается, что нет никаких запущенных постоянно процессов приложения. Эти процессы запускаются
либо по запросу пользователя, либо по различным тригерам облаком.Модульcelery-yandex-serverlessпомогает запустить воркер следующим образом:Бекенд отправляет задачу в очередьПосле попадания задачи в очередь срабатывает триггер, который делает http-запрос serverless-контейнеру.Serverless-контейнер запускает код задачи, который ранее выполнялся в воркере.ИспользованиеПодключение Celery к Yandex Message QueueПерейдите на страницу каталога в Яндекс.ОблакеЗайдите в разделСервисные аккаунтыПосмотрите название сервисного аккаунта в каталоге Яндекс.ОблакаСгенерируйтеACCESS_KEYиSECRET_KEYс помощью команды
(заменитеSERVICE_ACCOUNT_NAMEна название сервисного аккаунта):yciamaccess-keycreate--service-account-nameSERVICE_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замените на название проекта):fromdjango.urlsimportpathfromcelery_yandex_serverless.djangoimportworker_view_factoryfromprojectname.celeryimportappurlpatterns=[# другие адреса...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- ключ, созданный ранееycserverlesstriggercreatemessage-queue\--namecelery\--queueYANDEX_MESSAGE_QUEUE_ARN\--queue-service-account-nameSERVICE_ACCOUNT_NAME\--invoke-container-nameSERVERLESS_CONTAINER_NAME\--invoke-container-service-account-nameSERVICE_ACCOUNT_NAME\--invoke-container-path/worker/CELERY_YANDEX_SERVERLESS_KEY\--batch-size1\--batch-cutoff10sВключение логированияДобавьте вsettings.py:LOGGING={"version":1,"disable_existing_loggers":False,"loggers":{"celery_yandex_serverless.django":{"level":"INFO",},},}Уровни:INFO- инфорация о начале и окончании обработки задачиDEBUG- печать содержимого аргументов celery-таскаСтатьи в Яндекс.ОблакеПодключение CeleryДокументация по созданию триггеров через yc.Подробнее про работу триггера.Обновлениеpoetry version ...- обновить версиюзакомитить измененияgit tag ...- добавить тег с версией пакетаgit push --tags- запушить тегpoetry publish --build- опубликовать пакетАвторАтнагулов АртурЛицензия MIT.