Я пытаюсь понять лучший подход к управлению http-соединениями с использованием Apache HttpClient в реализации (не моей). Я думаю, то, как это реализовано сейчас, - пустая трата времени, но, поскольку я не очень знаком с этой библиотекой, я хотел бы подтвердить свои мысли.
Рассмотрим этот сценарий:
- У меня есть веб-приложение в tomcat, что означает многопоточную среду.
- Мне нужно связаться с Rest WebService из класса Rest. новый экземпляр класса Rest создается каждым запросом к моему приложению, чтобы вызвать нужную мне службу.
Опция 1 (в настоящее время реализовано): класс Rest создает новый экземпляр PoolingHttpClientConnectionManager и выполняет запрос.
Лично я думаю, что это пустая трата времени. Только один поток одновременно обращается к экземпляру менеджера. Таким образом, в этом подходе нет никакой пользы. Это на самом деле хуже, так как я предполагаю, что этот менеджер может быть дорогим для создания (?). Итак, в действительности мы в конечном итоге создаем несколько PoolingHttpClientConnectionManager, по одному на поток (по одному на запрос).
Вариант 2: класс Rest может создавать только один PoolingHttpClientConnectionManager как своего рода синглтон.
Тогда каждый поток из tomcat будет повторно использовать один и тот же диспетчер соединений, и для каждого потока будет создан только новый httpClient.
Я думаю, что это дает все преимущества пула, например, контроль количества соединений и повторное использование. Но я не знаю, насколько это полезно для менеджера (я думаю, что все должно быть в порядке, так как вся задача этого менеджера соединений - работать в многопоточных средах).
Вариант 3: класс Rest может создать один новый экземпляр BasicHttpClientConnectionManager.
Я попробовал это и работаю просто отлично. Это означает, что каждый поток будет иметь свой собственный менеджер соединений. Несмотря на то, что у этого менеджера есть одно соединение, поскольку у нас есть один менеджер на поток, мы выполняем параллельное выполнение.
Я думаю, что недостатком этого подхода является отсутствие ограничений. Поэтому, если мое приложение получает слишком много запросов, мы каждый раз создаем нового менеджера, плюс мы не будем повторно использовать соединения по тому же маршруту.
Буду признателен за любые мысли по этому поводу.
Я видел много примеров, но всегда простые примеры из основной функции и явное создание потоков. Не видел ни одного примера с сервера приложений, такого как tomcat.