JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Как настроить celery на разные очереди для разных Django проектов, находящихся на одном сервере?

Итак имеется VDS.
На нём две разные Django со своим виртуальным окружением. В разных местах.
В каждом установлен свой Celery.
В системе установлен (так сказать общие на всех) ещё RabbitMQ и запускается всё это дело SuperVisor`ом.

В каждой Django есть свои разные задачи (task), но одна из них в каждой Django имеет один и тот же функционал. А именно создание PDF файла. Естественно при настройке task у каждой этой "pdf-задачи" свой путь сохранения файла.

Так вот все задачи выстраиваются в одну очередь и получается следующее. Я запрашиваю всё время делать PDF для одного проекта (ну счёт-фактура). И вот один раз pdf-файл появляется в папке нужного проекта, а второй раз в папке другого. И так поочерёдно.

one-celery.conf (для супервизора)
[program:one-celery]
command=/home/iuser/djangoprojects/one/v_one/bin/celery worker -A one --loglevel=INFO
directory=/home/iuser/djangoprojects/one/
user=iuser
numprocs=1
stdout_logfile=/home/iuser/djangoprojects/logs/celery.log
stderr_logfile=/home/iuser/djangoprojects/logs/celery-err.log
autostart=true
autorestart=true
startsecs=10

stopwaitsecs = 600

stopasgroup=true

priority=1000


celery.py (в первом проекте)
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'one.settings.prod')

app = Celery('one')
app.config_from_object('django.conf:settings', namespace='CELERY_ONE')
app.autodiscover_tasks()


чуть не забыл, есть ещё одна строчка в settings -> prod.py
CELERY_BROKER_URL = 'amqp://localhost'

у второго проекта настройки точно такие же, только везде вместо one прописано two.

Что изменить (добавить) в вышеуказанных файлах, чтобы у каждого проекта была своя очередь задач?

С уважением, Максим
  • Вопрос задан
  • 1419 просмотров
Решения вопроса 1
JawsIk
@JawsIk Автор вопроса
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
Итак перепробовав кучу вариантов, у меня получился один единственный. Сложно мне сказать почему именно он, но возможно это как-то связано с версиями самого Celery, потому что все решения, старше 2018 года просто не сработали у меня. В итоге я совместил пару решений (найденных на стековерфлоу), которые были предложены в 2018 и в 2019 году и наконец-таки у меня получилось.

Итак файл settings.py . Вообще стал никак не задействован. В нём (если смотреть выше) была лишь настройка брокера. Она перекочевала в файл celery.py

celery.py теперь стал выглядеть так:
from kombu import Queue, Exchange, binding
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'one.settings')

# default_exchange = Exchange('default', type='direct')
one_exchange = Exchange('one_go', type='direct')

app = Celery('one', broker='amqp://localhost')
app.conf.update(
        task_queues= (
            Queue('one_go', [binding(one_exchange, routing_key='one_go')]),
        )
)

app.conf.update(
        task_routes= {
            'plugin.email.tasks.send_email': {'queue': 'one_go'},
            'plugin.print.tasks.create_pdf_task': {'queue': 'one_go'},
            'plugin.print.tasks.create_pdf_from_site_task': {'queue': 'one_go'},
        }
)
app.autodiscover_tasks()


ну а команда запуска находящаяся в файле
one-celery.conf (для супервизора) начало которого теперь выглядит так:
[program:one-celery]
command=/home/iuser/djangoprojects/one/v_one/bin/celery worker -A one -l info -Q one_go


Возможно что-то тут лишнее, может быть код избыточен, но работает именно так, как мне надо. Во второй "Джанге" всё так же, только вместо условного "one" везде прописано условное "two". Мучился над задачей с пятницы. Как говориться "не прошло и три дня". Всем спасибо.

p.s. Даже и не знаю почему у меня не работает через настройки типа CELERY_QUEUES или CELERY_ROUTES. Возможно эти параметры упразднены в угоду тех конструкций, что я написал в этом сообщении выше.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@terentjew-alexey
У RabbitMQ есть возможность настроить виртуальные хосты.
https://www.rabbitmq.com/vhosts.html

Соответственно у себя в проектах Вы поднимаете соединение к одному инстансу rabbitmq, но к разным виртуальным хостам.
# settings.py
CELERY_BROKER_URL = 'amqp://user:passwd@localhost:5672/my_first_host'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы