работает несколько рабочих через длинную очередь - PullRequest
1 голос
/ 12 января 2010

У меня длинная очередь mysql. У меня есть 1 рабочий скрипт, который обрабатывает каждую очередь.

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

пример рабочего скрипта

get_current_queue = SELECT from queue...

while(get_current_queue) {

update_current_row_from_queue "processing"

//some cpu intensive processing here that takes varying amount of time.

}

проблема в том, что рабочий скрипт занимает различное количество времени в зависимости от того, сколько времени занимает очередь в данный момент времени и сколько времени занимает обработка каждого процессора (конвертирование видео, например)

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

Я не знаю, как решить эту проблему.

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

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

Ответы [ 2 ]

1 голос
/ 12 января 2010

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

Это также облегчает проверку смерти работника. Поскольку каждый работник может иметь только одну задачу в любой момент времени.

Я реализовал подобную систему с кучей машин, на которых imagemagick обрабатывает более 250,00 изображений каждые выходные. (Вот тогда и пришли рабочие места.) Тогда я мог уволить рабочих в течение недели, когда нечего было делать, и запускать их по мере увеличения рабочей нагрузки. Работал как чемпион.

1 голос
/ 12 января 2010

Посвятите одно поле в очереди таблицы для идентификатора работника, который в данный момент обрабатывает строку.

Сначала сделай update queue set worker_id = myid Where worker_id = '' LIMIT 100 Затем select * from queue where worker_id = myid и обработайте эти строки. В конце концов удалите эти строки из очереди или отметьте их как обработанные.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...