2012-03-04 5 views
0

У меня около 1000-10000 заданий, которые мне нужно запускать на постоянной основе каждую минуту или около того. Иногда новая работа приходит или другие нужно отменить, но это редкое событие. Рабочие места помечены и должны быть нарушены рабочими, каждый из которых обрабатывает только задания определенного типа.Каков оптимальный способ организации бесконечно зацикленной рабочей очереди?

На данный момент я хочу использовать cron и загружать всю базу данных заданий в каком-то брокере - RabbitMQ или beanstalkd (не решили, какой из них использовать).

Но этот подход кажется мне уродливым (используя таймер для имитации бесконечности, загрузки всей базы данных и т. Д.) И имеет недостаток: например, если какие-то задания обрабатываются медленнее, чем добавляются в очередь, они могут быть перегружены и брокер сообщений будет есть все бараны, поменять местами, а затем просто остановиться.

Есть ли другие возможности? Я не использую правильные шаблоны для работы? (Может быть, мне не нужна очередь или что-то такое?)

p.s. Я использую python, если это важно.

ответ

1

Вы создаете свою начальную партию заданий и добавляете их в очередь. У вас есть n-потребители очереди, каждая из которых выполняет задания. Добавление потребителей в очередь просто округляет распределение заданий каждому слушающему потребителю, что дает вам произвольную горизонтальную масштабируемость.

Каждое задание может после завершения отвечать на повторную отправку обратно в очередь. Это означает, что ваша очередь заданий не будет расти за пределы той длины, в которой вы ее инициализировали. Мастер-задание может, при необходимости, создавать подзаголовки и добавлять их в очередь.

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

Тот факт, что вы используете Python, здесь не важен, это шаблон, а не тот язык, который вам нужно сначала прибить.

+0

Я вижу. И что, если у меня будет несколько миллионов заданий, я не смогу сразу загрузить их в очередь, какой шаблон я должен использовать для заполнения очереди? – Moonwalker

+0

Почему бы вам не заполнить очередь несколькими миллионами заданий? Кролику все равно. Просто прокачайте свои рабочие места и дайте им полететь. –

+0

Спасибо. Теперь все ясно. – Moonwalker

0

Вы можете использовать асинхронную структуру, например. Twisted

Я не думаю, что это хорошая идея запускать скрипт cron daemon каждую минуту (и вы упомянули причины), поэтому я предлагаю вам Twisted. Это не дает вам преимуществ при планировании, но вы получаете гибкость в управлении процессами и обмене памятью.

+0

Возможно, вы можете предложить немного больше деталей, чем в своем ответе! –

+0

Я пытался понять это, но мне кажется, что это слишком сложно для меня. И если понимать правильно искривленный асинхронный смысл, правильно? Итак, нет никаких преимуществ при планировании? – Moonwalker