2013-03-06 2 views
5

Я хотел бы реализовать распределенную систему выполнения работ с сельдереем. Учитывая, что rabbitMQ не поддерживает приоритеты, и мне очень нужна эта функция, я обратился к сельдеру + redis.Задача приоритет в сельдерее с redis

В моей ситуации задачи тесно связаны с оборудованием, например, задача А может выполняться только на Рабочем 1, поскольку только ПК Работника 1 имеет необходимое оборудование. Я устанавливал CONCURRENCY каждого работника равным 1, чтобы каждый рабочий выполнял только одну задачу. Каждая задача занимает около 2 минут.

Для реализации приоритета функции, в первую очередь я попытался добавить priority аргумент при вызове apply_async(), например apply_async(priority=0) и apply_async(priority=9). В этом тесте я запустил только одного Работника с COCURRENCY = 1 и отпустил 10 задач один за другим с разными приоритетами. Я ожидал увидеть, что задачи, начатые apply_async(priority=0), будут выполняться в приоритетном порядке, но, к сожалению, они только начинаются как начальный порядок.

Затем я пытаюсь выполнить некоторую работу. Я клонировал каждую задачу, поэтому для каждого из них у меня есть task_high и task_low, украшенные @celery.task(priority=0) и @celery.task(priority=1). Затем я сделал тот же тест, что и выше, на этот раз было лучше, когда начальный порядок - «HH-LLLL-HHHH», реальный порядок - «HH-L-H-H-L-H-L-L-H». Я полагаю, что redis сделал некоторые работы по планированию и балансировке.

Но это все еще не может удовлетворить мои ожидания. Я надеюсь получить такой заказ, как «HHHHHH-LLLL», потому что для некоторых задач у меня есть только одна надлежащая машина с необходимым оборудованием и надеюсь, что приоритетная задача будет запущена как можно скорее.

Я искал другую работу в Интернете, например, используя две очереди, одну для высокоприоритетных задач, а другую для низкоприоритетных и используя 2 машины для первой и 1 машины для последней. Но поскольку мое оборудование довольно ограничено, это не работает для меня.

Не могли бы вы дать несколько предложений?

ответ

13

Перевозка сельдерея Redis выполняет приоритетное поле, , но у Редиса нет понятия приоритетов.

Поддержка приоритетов реализована путем создания n списков для каждой очереди и использования этого порядка в команде BRPOP. Я говорю n, потому что хотя уровни приоритета 10 (0-9), по умолчанию это , чтобы сэкономить ресурсы. Это означает, что очередь с именем celery действительно будет разбит на 4 очереди:

['celery0', 'celery3`, `celery6`, `celery9`] 

Если вы хотите больше уровней приоритета вы можете установить опцию priority_steps транспорта:

BROKER_TRANSPORT_OPTIONS = { 
    'priority_steps': list(range(10)), 
} 

сказанного, отметим, что это никогда не будет так хорош, как приоритеты, реализованные на уровне сервера, и могут быть в лучшем случае приблизительными. Но для вашего приложения может быть достаточно хорошего .

+0

Спасибо за детали, но что я могу сделать, чтобы получить заказ, как я хочу? Должен ли я просто изменить «priority_steps»? – 2013-03-06 13:36:59

+0

Вы просто попробуете его. С приоритетными шагами по умолчанию эти 0 и 1 будут объединены только в 0. – asksol

+0

ОК спасибо, я пробовал с приоритетом 0 для задачи с высоким приоритетом и приоритетом 9 для задачи с низким, теперь это кажется намного лучше, хотя иногда некоторые задачи с приоритетом 9 все еще выполняются до тех, у кого приоритет 0. Я не знаю, есть ли что-то неправильно с моими конфигурациями, или это redis, который сделал некоторую работу балансировки. – 2013-03-07 01:11:13

Смежные вопросы