Я хочу создать клиент Джерси для многопоточного проекта. Нужно ли мне создавать пул соединений для клиента?
На сервере трафик 500 TPS. Как рассчитать приведенные ниже параметры для лучшей производительности.
ConnectionTimout, SocketTimeout, ReadTimeout, MaxConnectionPerHost, MaxConnections.
Что такое концепция сброса пула соединений и когда его использовать?
Клиент Джерси является потокобезопасным для выполнения нескольких запросов. Документация
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 подключений как начальное значение.
Не вижу смысла восстанавливать конфиг через определенный промежуток времени. PoolingHttpClientConnectionManager не поддерживает восстановление из коробки, но вы можете изменить любую конфигурацию во время выполнения. Наиболее важной концепцией является закрытие простаивающих и просроченных соединений с течением времени, необходимо реализовать некоторую стратегию вытеснения соединений. Для этого в пуле соединений есть методы closeExpiredConnections() и closeIdleConnections().
Есть ли что-то вроде пула resetConnection? (требуется ли сбрасывать конфигурации пула соединений по истечении определенного периода времени). Я спрашиваю об этом, потому что наткнулся на код, в котором есть задание cron, которое сбрасывает конфигурации пула соединений?