Ограничить подключения к различным направлениям в проекте RxJava / Micronaut - PullRequest
0 голосов
/ 10 января 2020

У меня есть проект, который читает данные от разных поставщиков; некоторые через SOAP, некоторые через HTTP, et c. Некоторые из этих провайдеров также имеют ограничение на количество одновременных подключений к ним. Например, провайдер A может разрешить неограниченное количество подключений, провайдер B может разрешить только 2, а провайдер C может разрешить 5.

Я в порядке с Micronaut, но я не знаю ничего, что встроено в него, что позволит мне ограничить количество подключений указанными c URL-адресами, если это необходимо. Итак, моя первая мысль - создать ограничение потока для каждого провайдера (возможно, используя систему планировщика Rx Java? Я полагаю, что вы можете создавать собственные, используя класс Executor Java), и позволить этому делать работу в очереди для меня. Я думаю, что я мог бы также go более ручной способ создания ConcurrentMap и сохранения количества активных соединений в нем, но это кажется более запутанным и более подверженным ошибкам.

Любой совет был бы очень признателен! Спасибо!

1 Ответ

1 голос
/ 12 января 2020

Ограничение номеров потоков подходит только в том случае, если сетевые подключения выполняются потоками, то есть синхронно. Но Micronaut также может устанавливать асинхронные соединения, и тогда ограничение количества потоков не будет работать. Лучше сделать ограничение количества соединений напрямую. Создайте промежуточный прокси-объект с тем же интерфейсом, что и Micronaut, и все входящие запросы передаются реальному Micronaut. У него также есть параметр - limit, и когда запрос передается, уменьшается предел. когда предел становится равным 0, прокси-объект прекращает передачу запросов, сохраняя их во входной очереди. Как только запрос завершен, он сигнализирует прокси-объект и пропускает один запрос из входной очереди, если таковой имеется, или просто увеличивает предел.

Простейшая реализация прокси - это поток с BlockingQueue для входные запросы и семафор для лимита. Но если есть много провайдеров и создание потока для каждого провайдера стоит дорого, прокси может быть реализован как асинхронный объект.

...