Django-celery. Идем по граблям своей дорогой.

Давненько что-то я не писал ничего.

Вот понадобилось поднять django-celery. В google информации рускоязычной не особо много, да и то что было немного уже устарело как показалось мне. Вот я и опишу с чем сталкивался в ходе разворачивания этого приложения.

На момент установки была последняя версия 3.0.11. Ее я и взял.
Celery поддерживает несколько бекендов, включая RabbitMQ, Redis, базу данных и другие.
Я ранее особо с этим не работал, поэтому особо не заморачивался с выбором и по рекомендации разработчиков выбрал RabbitMQ. У меня проект не высоко-нагружен был, так что особых претензий не должно быть, в общем решил поработать с RabbitMQ и понаблюдать заодно что это и как работает.

Итак что имеем в строках требованияв проекте:

Django==1.4.1
psycopg2==2.4.5
celery==3.0.11
django-celery==3.0.11

Установка RabbitMQ

У меня Debian, и для установки RabbitMQ достаточно было выполнить,

$ sudo apt-get install rabbitmq-server

Показателем успешной установки должно быть сообщение "Starting rabbitmq-server: SUCCESS".

на сервере проекта CentOS и админ установил соответвующий пакет тоже без проблем командами для CentOS.

Настройка RabbitMQ

в файле конфигурации settings.py устанавливаем:

BROKER_URL = 'amqp://guest:guest@localhost:5672//'
INSTALLED_APPS = (
    ...
'djcelery', )

Запуск

python manage.py celery worker --loglevel=info

или,
./manage.py celeryd --concurrency=1 --loglevel=INFO

--concurrency=1  - локально запускам Celery с всего лишь одним максимально возможным конкурентным заданием в очереди и уровнем вывода INFO, думаю для отладки этого достаточно. Для Production-сервера, такое естественно не подходит и нужно что то более удобное, например использование init.d скрипта

Init script: celeryd

Использование: /etc/init.d/celeryd {start|stop|restart|status}

Файл конфигурации: /etc/default/celeryd

Мы используем virtualenv и файл такого содержания должен быть согласно инструкции

# Name of nodes to start, here we have a single node
CELERYD_NODES="w1"
# or we could have three nodes:
#CELERYD_NODES="w1 w2 w3"

# Where to chdir at start.
CELERYD_CHDIR="/opt/Myproject/"

# Python interpreter from environment.
ENV_PYTHON="$CELERYD_CHDIR/env/bin/python"

# How to call "manage.py celeryd_multi"
CELERYD_MULTI="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryd_multi"

# How to call "manage.py celeryctl"
CELERYCTL="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryctl"

# Extra arguments to celeryd
CELERYD_OPTS="--time-limit=300 --concurrency=8"

# Name of the celery config module.
CELERY_CONFIG_MODULE="celeryconfig"

# %n will be replaced with the nodename.
CELERYD_LOG_FILE="/var/log/celery/%n.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"

# Workers should run as an unprivileged user.
CELERYD_USER="celery"
CELERYD_GROUP="celery"

# Name of the projects settings module.
export DJANGO_SETTINGS_MODULE="MyProject.settings"

Использование kombu и хранение в базе данных

еще ставил kombu==2.4.7 локально, чисто для того чтоб попробовать.
с настройками в settings.py

import djcelery
djcelery.setup_loader()
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"
BROKER_URL = 'django://'
INSTALLED_APPS = (
    ...
'djcelery', 'kombu.transport.django', )

после этого

$ python manage.py syncdb

вариант с kombu тоже вполне рабочий, например для локального тестирования чтоб не устанавливать rabbitmq-server, если позволяют ограничения при использовании kombu

Ну вот пожалуй и все.

Следующая запись

Предыдущая запись

Похожие записи

Комментарии

Еще нет комментариев.

Пингбэки

Оповещения открыты.

Трэкбэки

URL архива

Only authorized users can post comments