Способ самоорганизации очереди заданий - PullRequest
6 голосов
/ 02 января 2011

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

Для того, чтобы быть вежливым, я не хочу, чтобы моя система многократно била по одному хосту. Таким образом, если я получаю задание № 123 для извлечения чего-то с сайта example.com, но я вижу, что за последние X секунд я только что получил еще одну вещь с сайта example.com, я должен перейти к чему-то другому и сохранить задание № 123 для позже.

Вопрос в том, что является хорошим способом для реализации этого шаблона?

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

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

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

  2. Спите сколько угодно секунд, пока вежливость не потребует выполнения задания. Это может привести к тому, что многие процессоры очереди одновременно ничего не делают.

  3. Примите задание, но сохраните его в локальной очереди где-нибудь на каждом процессоре очередей. Я полагаю, что каждый процессор может «претендовать» на несколько заданий таким образом, а затем выбирать для их обработки в любом порядке, чтобы достичь максимальной вежливости. Это все еще может быть непредсказуемым, потому что каждый процессор очереди должен знать о доменах, пораженных всеми остальными.

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

Есть ли у вас опыт проектирования такого рода вещей? Какую стратегию вы бы порекомендовали?

Ответы [ 2 ]

2 голосов
/ 02 января 2011

Отдельные очереди для каждого домена и очереди доменов.

Каждый процессор должен:

  1. Выбрать домен из очереди доменов.
  2. Если домен былНе обновлено недавно, выберите главную задачу из очереди домена.
  3. Верните домен в конец очереди домена.
  4. Если у нас есть задача для выполнения, сделайте это.
  5. Спите, пока не настало время проверить заголовок очереди домена или очередь домена обновлена.

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

0 голосов
/ 02 января 2011

Я бы порекомендовал настроить очередь для каждого домена и по одному процессору на очередь.

У большинства серверов не должно быть проблем с запросами, выполняемыми последовательно, если вы следите за общим объемом передачи (например, вам следует избегать индексации файлов размером более нескольких сотен КБ, если у васреальная потребность в этом).

Полагаю, вы тоже подчиняетесь правилам robots.txt.

...