Можно ли использовать Jersey Client в многопоточной среде для использования остальных API?

Я хочу создать клиент Джерси для многопоточного проекта. Нужно ли мне создавать пул соединений для клиента?

На сервере трафик 500 TPS. Как рассчитать приведенные ниже параметры для лучшей производительности.

ConnectionTimout, SocketTimeout, ReadTimeout, MaxConnectionPerHost, MaxConnections.

Что такое концепция сброса пула соединений и когда его использовать?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Клиент Джерси является потокобезопасным для выполнения нескольких запросов. Документация

Methods to create instances of WebResource are thread-safe. Methods that modify configuration and or filters are not guaranteed to be thread-safe.

The creation of a Client instance is an expensive operation and the instance may make use of and retain many resources. It is therefore recommended that a Client instance is reused for the creation of WebResource instances that require the same configuration settings.

Рекомендуется повторно использовать один и тот же экземпляр класса Client для выполнения нескольких запросов. Изменение конфигурации Client не является сохранением потока и должно обрабатываться соответствующим образом.

Нужно ли создавать пул соединений для клиента?
Краткий ответ Да.
По умолчанию клиент Джерси использует BasicHttpClientConnectionManager. Документация

It is a simple connection manager that maintains only one connection at a time. Even though this class is thread-safe it ought to be used by one execution thread only. BasicHttpClientConnectionManager will make an effort to reuse the connection for subsequent requests with the same route. It will, however, close the existing connection and re-open it for the given route, if the route of the persistent connection does not match that of the connection request. If the connection has been already been allocated, then java.lang.IllegalStateException is thrown.

Для многопоточного приложения вам необходимо переопределить значение по умолчанию с помощью PoolingHttpClientConnectionManager.

It is a more complex implementation that manages a pool of client connections and is able to service connection requests from multiple execution threads. Connections are pooled on a per route basis. A request for a route for which the manager already has a persistent connection available in the pool will be serviced by leasing a connection from the pool rather than creating a brand new connection.

PoolingHttpClientConnectionManager maintains a maximum limit of connections on a per route basis and in total. Per default this implementation will create no more than 2 concurrent connections per given route and no more 20 connections in total. For many real-world applications these limits may prove too constraining, especially if they use HTTP as a transport protocol for their services.

Подробнее Управление соединениями Apache

Конфигурация
Общая рекомендация — избегать бесконечных тайм-аутов, которые Джерси устанавливает по умолчанию. Это может привести к застреванию потоков в случае возникновения проблем. См. Лучшие практики для тайм-аутов веб-службы, выберите правильное значение. Конкретных значений нет, они должны быть установлены на основе служб и производительности среды. Правильные тайм-ауты и размер соединения будут получены через время после тестирования производительности или использования в реальном времени.
Просто реализуй гибко, добавь возможность менять настройки на лету.


Тайм-аут чтения

Read timeout interval property, in milliseconds. The value MUST be an instance of Integer. If the property is absent then the default value is an interval of infinity. A value of zero 0 is equivalent to an interval of infinity

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


Время соединения вышло

Connect timeout interval property, in milliseconds. The value MUST be an instance of Integer. If the property is absent then the default value is an interval of infinity. A value of 0 is equivalent to an interval of infinity

Установите 500 - 1000 миллисекунд, как начальное значение.


Максконнектионперхост
Установите 20 подключений как начальное значение.


МаксКоннектионс
Установите 200 подключений как начальное значение.

Есть ли что-то вроде пула resetConnection? (требуется ли сбрасывать конфигурации пула соединений по истечении определенного периода времени). Я спрашиваю об этом, потому что наткнулся на код, в котором есть задание cron, которое сбрасывает конфигурации пула соединений?

Codemaster 28.03.2022 11:08

Не вижу смысла восстанавливать конфиг через определенный промежуток времени. PoolingHttpClientConnectionManager не поддерживает восстановление из коробки, но вы можете изменить любую конфигурацию во время выполнения. Наиболее важной концепцией является закрытие простаивающих и просроченных соединений с течением времени, необходимо реализовать некоторую стратегию вытеснения соединений. Для этого в пуле соединений есть методы closeExpiredConnections() и closeIdleConnections().

Eugene 28.03.2022 12:46

Другие вопросы по теме