Регулирование исходящих HTTP-запросов

Я использую vert.x в качестве сервера для получения запроса на поиск, который затем обрабатывается на сервере для нескольких исходящих HTTP-запросов к различным внешним службам.

Для асинхронного поведения я решил использовать RxJava с собственным http-клиентом Vert.x.

Дело в том, что услуги, которыми я пользуюсь, ограничивают меня максимум 1 звонком в секунду.

Каким будет лучший/простой способ ограничить исходящие HTTP-запросы NIO?

  1. В среде с одним сервером.
  2. В среде кластерного сервера.

person Yaniv Cohen    schedule 27.10.2016    source источник
comment
Не могли бы вы показать код? Я не понимаю, почему вы должны полностью реагировать, если у вас есть узкое место в одну секунду?   -  person Hans Wurst    schedule 27.10.2016
comment
Я использую RxJava, потому что это кажется более полным решением для асинхронного функционального программирования, чем API на основе будущего или обещаний.   -  person Yaniv Cohen    schedule 29.10.2016


Ответы (1)


На одном сервере наивным подходом к решению вашей проблемы будет:

  1. Поместите запрос и обработчик результата в очередь
  2. Иметь периодический обработчик, который каждую секунду извлекает элемент из очереди и выполняет запрос.
  3. Вызвать обработчик результата с результатом или ошибкой

В кластерном виде вы можете расширить предыдущую концепцию и обернуть ее адресом шины событий, чтобы это выглядело примерно так:

  1. Отправьте сообщение на адрес с запросом и настройте обработчик ответа
  2. Сервис будет работать как в предыдущем объяснении
  3. Вместо вызова обработчика служба будет полагаться на обработчик ответа на сообщение для передачи результата.
person Paulo Lopes    schedule 28.10.2016
comment
Спасибо Пауло за ваш ответ, что касается кластерной части ответа, мне придется контролировать скорость потребления этой очереди шины сообщений, чтобы она соответствовала пределу скорости исходящих вызовов. - person Yaniv Cohen; 29.10.2016