Antonio051
Ноя. 4, 2013 13:14:45
Есть celery-worker, который обслуживает конкретную очередь:
python manage.py celery worker -c 1 -E -l INFO -n phones -Q htc
“-n phones” - имя воркера
“-Q htc” - имя, обслуживаемой очереди
Динамически создаю новую очередь и отправляю её воркеру “phones”.
Как заставить воркер обслуживать одновременно две очереди. Чтобы брал задания из каждой очереди.
Сейчас же он берёт по принципу FIFO.
PS. “-c 1” это для пирмера. Увеличивать concurrency не вариант. Необходимо равномерно опустошать очереди.
Брокер: RabbitMQ/Redis
Lexander
Ноя. 4, 2013 13:51:55
Указать вторую очередь через запятую.
Но это все равно не гарантирует математической равномерности.
Antonio051
Ноя. 4, 2013 13:57:46
Lexander
Указать вторую очередь через запятую.
-Q htc,lg
Это я в курсе.
Но я делаю это динамически.
Lexander
Ноя. 4, 2013 15:25:47
Antonio051
Ноя. 4, 2013 15:34:41
Lexander
http://docs.celeryproject.org/en/latest/userguide/workers.html#std:control-add_consumer
Именно это я и использую.
Проблема в том, как воркер берет задания из нескольких очередей.
Наткнулся на weighted fair queueing. Это то, что мне нужно.
Celery использует Kombu. В ней есть такая штука
http://kombu.readthedocs.org/en/latest/reference/kombu.transport.virtual.scheduling.htmlТеперь не понимаю как её использовать?
Далее вижу
http://docs.celeryproject.org/en/master/whatsnew-3.0.html#redis-now-cycles-queues-so-that-consuming-is-fairТ.е. если использовать redis как брокер, то будет работать “справедливая очередь”.
Ща попробую