На самом деле у меня есть несколько приложений django с задачами сельдерея. Мне нужно, чтобы каждая задача выполнялась в определенном канале, чтобы я мог контролировать нагрузку. Например, у меня может быть 3 сервера для прослушивания channel_for_app_1
и два для channel_for_app_2
. Мой вопрос: как я могу запустить демон сельдерея и указать канал? Любые другие способы сделать это?
Мне нужен демон django-celery для прослушивания определенного канала rabbitmq
Ответы (2)
Просмотрите эту страницу: http://docs.celeryproject.org/en/latest/userguide/routing.html.
Ваш сельдерей должен начинаться с параметров -Q, --queue, которые определяют, какая очередь будет использоваться для получения задач.
В настройках django вы можете указать CELERY_QUEUES:
CELERY_QUEUES = {
"worker": {
"exchange": "worker",
"binding_key": "worker"
},
вот так. Каждый ключ — это имя очереди, и вы можете изменить ключ обмена и привязки, если хотите пофантазировать (множественные обмены и т. д.), но мне это никогда не требовалось.
Определив задачу, вы можете
@task(queue="worker", etc)
Последний шаг — указать имена очередей при запуске celery — либо через конфигурацию демона celery, либо в командной строке при его запуске. Результатом всего этого является то, что задачи сельдерея будут идти в очереди, указанные в определении задачи, и только на ящиках, на которых запущена указанная очередь.
Поэтому я не уверен, имеете ли вы в виду что-то явно другое, когда говорите «каналы», но я всегда использовал несколько очередей для каждой задачи, чтобы делать именно то, что вы описываете.
...please insert code here
, где вы не можете понять, как это сделать? - person KobeJohn   schedule 27.11.2013TaskConsumer
. Но как я могу сделать это с помощью django-celery? - person Andrii Zarubin   schedule 27.11.2013