2012-04-19 5 views
17

Я только начинаю использовать django-celery, и я хотел бы установить, что celeryd работает как демон. Тем не менее, instructions предполагает, что он может быть настроен только для одного сайта/проекта за раз. Может ли celeryd обрабатывать более одного проекта, или он может обрабатывать только один? И, если это так, есть ли чистый способ настроить celeryd для автоматического запуска для каждой конфигурации, что требует от меня создания отдельного сценария инициализации для каждого из них?Использование celeryd в качестве демона с несколькими приложениями django?

ответ

8

Как и все интересные вопросы, ответ это зависит. :)

Это, безусловно, возможно придумать сценарий, в котором celeryd может использоваться двумя независимыми сайтами. Если несколько сайтов отправляют задачи на один и тот же обмен, а задачи не требуют доступа к какой-либо конкретной базе данных - скажем, они работают с адресами электронной почты или номерами кредитных карт или чем-то иным, кроме записи в базе данных, - тогда один сельдерей может быть достаточным. Просто убедитесь, что код задачи находится в общем модуле, который загружается всеми сайтами и сервером сельдерея.

Как правило, вы обнаружите, что сельдерей нуждается в доступе к базе данных - либо он загружает объекты на основе идентификатора, который был передан в качестве параметра задачи, либо он должен написать некоторые изменения в базе данных, или, чаще всего, оба. И несколько сайтов/проектов обычно не используют базу данных, даже если они используют одни и те же приложения, поэтому вам необходимо оставить очереди задач отдельными.

В этом случае, как правило, происходит то, что вы создали один брокер сообщений (например, RabbitMQ) с несколькими биржами. Каждый обмен получает сообщения с одного сайта. Затем вы запускаете один или несколько процессов celeryd где-то для каждого обмена (в настройках конфигурации celery вам нужно указать обмен. Я не верю, что celeryd может слушать несколько обменов). Каждый сервер celeryd знает свой обмен, приложения, которые он должен загрузить, и базу данных, к которой он должен подключиться.

Чтобы управлять ими, я бы предложил посмотреть на cyme. Это by @asksol, и управляет несколькими экземплярами celeryd, на нескольких серверах, если необходимо. Я не пробовал, но похоже, что он должен обрабатывать разные конфигурации для разных экземпляров.

1

Не пробовал, но с использованием сельдереем 3.1.x, который не нуждается в Джанго-сельдерее, согласно документации вы можете создать экземпляр сельдерого приложения вроде этого:

app1 = Celery('app1') 

app1.config_from_object('django.conf:settings') 
app1.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 


@app.task(bind=True) 
def debug_task(self): 
    print('Request: {0!r}'.format(self.request)) 

Но вы можете использовать сельдерей мульти для запуска несколько работники с одной конфигурацией каждый, вы можете увидеть примеры here. Таким образом, вы можете запустить несколько рабочих с различными --app appX параметров, так что будет использовать разные Такса и настройки:

# 3 workers: Two with 3 processes, and one with 10 processes. 
$ celery multi start 3 -c 3 -c:1 10 
celery worker -n [email protected] -c 10 --config celery1.py --app app1 
celery worker -n [email protected] -c 3 --config celery2.py --app app2 
celery worker -n [email protected] -c 3 --config celery3.py --app app3 
Смежные вопросы