Как организовать очереди сообщений (типа RabbitMQ) с ограничением скорости обработки?
Мне нужно организовать параллельную обработку заданий на нескольких машинах. Каждое задание - это обращение к одной из 10 внешних систем, которые нежелательно дергать чаще заданного интервала. У каждой системы он свой: примерно от 0 до 5000 мс.
Мне нужен хитрый механизм организации очередей, так чтобы с одной стороны любой обработчик мог получить любое задание, а с другой - задания обрабатывались не быстрее минимального интервала.
Про RabbitMQ пока только читаю, но похоже, он такое не умеет.
Можно конечно это отслеживать на стороне продьюсера и не добавлять задания быстрее, чем нужно, но хотелось бы просто кидать задания в очередь, и чтобы она сама про это думала.
Нужно ограничивать скорость потребления сообщений из очереди. Если внешним системам нужен отдых, то обработчик, потребляющий задания из очереди, должен следить за обеспечением этого условия.
Если потребители уже написаны и у вас нет их кода, можно посадить их на отдельные очереди и написать простой маршрутизатор перекладывающий сообщения из общей очереди заданий в очередь заданий для внешней системы с нужной задержкой.
Ну в первом случае мне нужно будет как-то реализовать общую глобальную память у обработчиков, чтобы они все знали про время последнего обращения. Второй вариант более красив, наверное.