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