Мне нужно направить все задачи определенного экземпляра сайта django в определенную очередь. Моя настройка выглядит следующим образом:
- несколько веб-серверов, на которых запущен проект Django (1.7)
- один сервер с работниками сельдерея (3.1.7)
- Три среды: продакшн, постановка, разработка. Каждая среда работает с разными
DJANGO_SETTINGS_MODULE
, с разнымиCELERY_DEFAULT_QUEUE
настройками. - Один экземпляр Redis в качестве брокера (все в одной базе данных)
На «сервере сельдерея» я запускаю несколько рабочих экземпляров через супервизор (упрощенная конфигурация):
[program:production_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.production
command=/pth/to/python celery -A website.celery worker --events --queues myserver --loglevel WARNING --concurrency 4 -n [email protected]
[program:staging_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.staging
command=/pth/to/python celery -A website.celery worker --events --queues myserver_staging --loglevel WARNING --concurrency 1 -n [email protected]
[program:development_queue]
environment=PYTHONPATH=/pth/to/src/:/pth/to/site-packages/,DJANGO_SETTINGS_MODULE=website.settings.development
command=/pth/to/python celery -A website.celery worker --events --queues myserver_development --loglevel INFO --concurrency 1 -n [email protected]
Это работает при осмотре:
$ celery -A website.celery inspect activeues
-> [email protected]: OK
* {u'exclusive': False, u'name': u'myserver', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
-> [email protected]: OK
* {u'exclusive': False, u'name': u'myserver_staging', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
-> [email protected]: OK
* {u'exclusive': False, u'name': u'myserver_development', u'exchange': {u'name': u'celery', u'durable': True, u'delivery_mode': 2, u'passive': False, u'arguments': None, u'type': u'direct', u'auto_delete': False}, u'durable': True, u'routing_key': u'celery', u'no_ack': False, u'alias': None, u'queue_arguments': None, u'binding_arguments': None, u'bindings': [], u'auto_delete': False}
(Имена соответствуют настройкам CELERY_DEFAULT_QUEUE)
website/celery.py
содержит основы (импорт пропущен):
app = Celery('proj')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
Поэтому я ожидаю, что задачи, сгенерированные веб-сервером, работающим с настройками разработки, будут выполняться только в development_queue
и так далее. Однако я вижу, что задачи обрабатываются другой очередью или всеми тремя, что проблематично.
Я ошибаюсь в том, что это был бы хороший способ разделить эти задачи? Все документация по маршрутизации посвящена маршрутизации различных задач в разные очереди, которые мне не нужны. Мне нужно направить все задачи определенного сайта (среды) в определенную очередь. Что я могу сделать, чтобы разделить эти среды?
-Q queue_name
- person itzMEonTV   schedule 13.02.2015--queues myserver
, который совпадает с-Q myserver
), но, как я уже сказал, это не работает. - person Tino   schedule 03.11.2015True
. Вы знаете, как это работает? Какой префикс ставит? В документации говорится: вы должны установить параметр транспорта для префикса сообщений, чтобы они были получены только активным виртуальным хостом, но что такое активный виртуальный хост? (Что такое виртуальный хост?) Не могу найти его в документации. - person Tino   schedule 12.11.2015