2013-09-11 6 views
12

Вот мой сценарий:Создание динамических очередей с сельдереем

Когда пользователь входит в системе на мой сайт, я в очереди кучи заданий для данного пользователя (как правило, каждая задача занимает 100е из миллисекунд и есть 100s задача на пользователя). Эти задачи помещаются в очередь по умолчанию в Celery Queue, и у меня работает 100 человек. Я использую websockets, чтобы показать прогресс пользователя в режиме реального времени по мере выполнения задач на бэкэнд. Жизнь хороша, если у меня только 1 или 2 пользователя.

Теперь, если я несколько одновременных пользователей на моем сайте, последние пользователи поставлены в очередь за начальными пользователями и их задачи голодают (так как все задачи идут в одну очередь). Мои мысли - создать динамическую очередь для каждого пользователя, чтобы обеспечить справедливость. Однако, согласно документации на сельдерей (http://docs.celeryproject.org/en/latest/userguide/routing.html#defining-queues), мне кажется, что нужно ставить статические очереди.

Любые предложения по наилучшим методам использования сельдерея для моего сценария?

+0

Не был имеющей динамические очереди поражения объект создания очередей? 100-ые задачи звучат как много для каждого пользователя. Разве они не могут быть сгруппированы вместе, чтобы рабочий мог сразу же выполнить все задачи пользователей? Таким образом, у пользователя будет отдельный рабочий для процесса входа в систему. Необходимо ли синхронизировать все задачи входа в систему? –

+0

@JoeDoherty - Я не понимаю, как динамические очереди будут побеждать объект очереди. Однако ваше предложение о том, чтобы выполнять все задачи для каждого пользователя как одну большую задачу, очень интересно и, безусловно, облегчит мою проблему - спасибо !. С точки зрения дизайна, однако, я пытался найти большой пул работников, выполняющих небольшие/быстрые задачи (по сравнению с длительными задачами). Мне все равно будет интересно узнать, есть ли возможность создавать очереди на ходу, хотя я вижу, что это полезно, даже если я выполняю задачи пользователя. –

+0

@JoeDoherty - Что касается «Все задачи входа в систему должны выполняться синхронно» - ответ «Нет». Требование состоит в том, что все они завершаются в разумные сроки, так как пользователь ждет завершения результатов задач на веб-сайте. –

ответ

2

http://docs.celeryproject.org/en/latest/userguide/workers.html#queues

celery -A proj control add_consumer foo -d worker1.local 

То же самое может быть выполнено динамически с использованием методы app.control.add_consumer():

app.control.add_consumer('foo', reply=True) 
[{u'worker1.local': {u'ok': u"already consuming from u'foo'"}}] 

app.control.add_consumer('foo', reply=True, 
destination=['[email protected]']) 
Смежные вопросы