Метод самореорганизации очередь заданий

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

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

Вопрос в том, как лучше всего реализовать этот шаблон?

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

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

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

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

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

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

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

6
задан friedo 2 January 2011 в 04:57
поделиться