У нас есть клиент-джерси с базовой конфигурацией:
public class HttpClient {
private transient final WebTarget target;
public HttpClient(final String host, final int port, final String path, final int requestTimeout) {
final URI uri = UriBuilder.fromUri("http://" + host).port(port).build();
final Client client = ClientBuilder.newClient();
client.property(ClientProperties.READ_TIMEOUT, requestTimeout);
target = client.target(uri).path(path);
}
public byte[] makeRequest(final byte[] request) throws HsmException {
try {
return target.request()
.accept(MediaType.APPLICATION_OCTET_STREAM)
.post(Entity.entity(request, MediaType.APPLICATION_OCTET_STREAM), byte[].class);
}
catch (Exception e) {
// Box JAX-RS exceptions as they get weirdly handled by the outer Jersey layer.
throw new Exception("Could not make request: " + e.getMessage(), e);
}
}
}
Теперь с этим клиентом нам удается выполнять около 900 запросов в секунду.Поэтому, пытаясь добиться лучших результатов, я подумал о реализации пула с использованием Apache Http-клиента с джерси-коннектором, например:
public class HttpClient {
private transient final WebTarget target;
public HttpClient(final String host, final int port, final String path, final int requestTimeout) {
final ClientConfig clientConfig = new ClientConfig();
clientConfig.property(ClientProperties.READ_TIMEOUT, requestTimeout);
clientConfig.property(ClientProperties.CONNECT_TIMEOUT, 500);
final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(150);
connectionManager.setDefaultMaxPerRoute(40);
connectionManager.setMaxPerRoute(new HttpRoute(new HttpHost(host)), 80);
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, connectionManager);
final ApacheConnectorProvider connector = new ApacheConnectorProvider();
clientConfig.connectorProvider(connector);
final URI uri = UriBuilder.fromUri("http://" + host).port(port).build();
final Client client = ClientBuilder.newClient(clientConfig);
target = client.target(uri).path(path);
}
@Override
public byte[] makeRequest(final byte[] request) throws HsmException {
try {
return target.request()
.accept(MediaType.APPLICATION_OCTET_STREAM)
.post(Entity.entity(command, MediaType.APPLICATION_OCTET_STREAM), byte[].class);
}
catch (Exception e) {
// Box JAX-RS exceptions as they get weirdly handled by the outer Jersey layer.
throw new Exception("Could not make request:" + e.getMessage(), e);
}
}
}
И результаты в точности совпадают, около 900 запросов в секунду.
Я не ограничен ЦП, ОЗУ, диском и т. Д. Я не могу найти узкое место.Я протестировал несколько значений при настройке менеджера соединений, но с точно такими же результатами.
Я что-то упустил?Есть ли другие параметры, которые я пропускаю?Я использую это неправильно?