Каков оптимальный способ организации бесконечно зацикленной рабочей очереди? - PullRequest
0 голосов
/ 04 марта 2012

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 05 марта 2012

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

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

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

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

0 голосов
/ 06 марта 2012

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

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

...