Использование celeryd в качестве демона с несколькими приложениями django? - программирование
Подтвердить что ты не робот

Использование celeryd в качестве демона с несколькими приложениями django?

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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))

Но вы можете использовать celery multi для запуска нескольких рабочих с одной конфигурацией каждый, вы можете увидеть примеры здесь. Таким образом, вы можете запускать нескольких сотрудников с различными параметрами --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