Какой самый элегантный способ запустить celeryd в проекте Django? - PullRequest
4 голосов
/ 10 марта 2012

Я начинаю с Celery в своем проекте Django и не мог не задуматься: какой самый элегантный способ начать работу рабочих Celery для проекта?

Позвольте мне объяснить причинуэтот вопрос.

В настоящее время рекомендуемый способ запуска Celery - python manage.py celeryd в более простых установках и что-то вроде /etc/init.d/celeryd start в более сложных.Тем не менее, в первом случае этот процесс выглядит хрупким, поскольку процесс не запустится автоматически, а во втором требуется совсем немного конкретной конфигурации проекта (virtualenv, settings и т. Д.). Особенно последний демонстрирует мое общее чувствочто работник Celery тесно связан с базой кодов, частью которой он является, и он также тесно связан с основным процессом проекта, поскольку работник Celery, у которого нет чего-то для создания задач, практически бесполезен (за исключением celerybeat).Другая проблема со сценариями init.d заключается в том, что им потребуется некоторая продвинутая логика для обработки нескольких проектов на сервер (с отдельными виртуальными средами, настройками, путями и т. Д.)

Так что я подумал, что это может быть довольно элегантная конфигурация- чтобы запустить celeryd вместе с моим основным процессом, например, запустить его из mod_wsgi с помощью Apache (аналогично для других параметров настройки) и, таким образом, убить его, когда основной процесс завершится (/etc/init.d/apache2 stop).Однако я не совсем уверен, существуют ли какие-либо технические ловушки с точки зрения производительности и / или безопасности в этом рассуждении - это может быть так, поскольку я попытался найти это в Google и практически ничего не нашел.

  1. Являются ли мои рассуждения ошибочными, учитывая архитектуру Celery?
  2. Могу ли я как-то создать celeryd где-то внутри mod_wsgi и это разумно?
  3. Как вы начинаете работников Celery вваши проекты?

1 Ответ

3 голосов
/ 03 ноября 2012

Я запускаю celery с помощью manage.py celeryd и управляю этим с помощью supervisor. В каждом развертывании, которое изменяет задачу, я просто перезапускаю сельдерей после того, как развернул и перезапустил apache. \

Edit:

Мы используем chef для управления нашими конфигурациями для супервизора и других процессов, так что это может быть немного излишним. У нас есть один главный файл supervisord.conf, который включает отдельный файл конфигурации для каждого сайта, который мы запускаем. Один из них может выглядеть так:

[program:celery_newproject]
command = /srv/www/.virtualenvs/newprojectenv/bin/python /srv/www/projects/newproject/manage.py celeryd --concurrency=2 --settings=settings.alpha --pidfile=/var/run/celery/celery_newproject.pid
user = wsgiuser
environment = PYTHON_EGG_CACHE="/tmp/.python-eggs"

При развертывании мы просто запускаем

sudo supervisorctl restart celery_newproject

Это перезапускает процесс супервизора для сельдерея и выбирает все новые задачи, которые вы определили.

Есть и другие не элегантные способы сделать это. На моих личных сайтах у меня просто запущено задание cron, которое проверяет наличие файла .pid и перезапускает сельдерей, если его не существует. Совсем не элегантно, но работает на сайтах с низкой надежностью.

...