У меня есть очередь заданий (с использованием Amazon SQS), которая передает задания многим машинам для выборки и обработки различных документов через HTTP. Доступ к сотням различных хостов, и нет предсказуемого порядка для заданий.
Чтобы быть вежливым, я не делаю: Я не хочу, чтобы моя система постоянно забивала один хост. Таким образом, если я получаю задание № 123, чтобы получить что-то с example.com, но я вижу, что я только что получил другое задание с example.com за последние X секунд, я должен перейти к чему-то другому и сохранить задание № 123 для позже.
Вопрос в том, как лучше всего реализовать этот шаблон?
Кажется, первым шагом было бы, чтобы исполнители заданий вели где-нибудь список всех доменов и время последнего доступа к чему-то в этом домене . Я предполагаю, что это может быть простая таблица БД.
Тогда есть много возможных вариантов, что делать, если обработчик сообщений получает задание, которое необходимо отложить.
Просто поместите копию сообщения в конец очередь и выбросить, не выполняя. Надеюсь, что к следующему разу пройдет достаточно времени. Это может привести к появлению большого количества избыточных сообщений SQS, особенно если сразу выполняется большой кластер заданий для одного и того же домена.
Спите столько секунд, сколько необходимо, пока вежливость не укажет, что задание может быть выполнено. Это может привести к тому, что множество процессоров очереди одновременно ничего не будут делать.
Принять задание, но сохранить его в локальной очереди где-нибудь на каждом процессоре очереди. Я предполагаю, что каждый процессор может таким образом «потребовать» несколько заданий, а затем решить обрабатывать их в любом порядке, обеспечивающем максимальную вежливость. Это по-прежнему может быть непредсказуемым, потому что каждый процессор очереди должен знать о доменах, пораженных всеми остальными.
Установите отдельные очереди для каждого домена и выделите по одному процессу для каждой очереди. Каждый процесс должен будет останавливаться на X секунд между выполнением каждой работы, так что ' много накладных расходов на спящий процесс, но, может быть, это не так уж и плохо.
Есть ли у вас какой-нибудь опыт в разработке подобных вещей? Какую стратегию вы бы порекомендовали?