Оптимизация Camel HTTP4 с помощью KeepAlive
Я хочу иметь возможность POST-сообщения на HTTPS-сервер с использованием Camel с довольно высокой скоростью ( > 1500/ сек), используя только одно соединение с сервером.
Я попытался установить для keepAlive значение true, но все еще не вижу каких-либо улучшений в скорости.
Взял tcpdump при отправке 5 сообщений, и я нашел 5 пакетов SYN/ACK на wireshark. Возможно, сертификат SSL также отправляется на каждом POST. (102 пакета захвачены tcpdump, но все, что я посылаю, это 5 строк "HelloWorld")
Есть ли способ ускорить процесс? Это код, который я использовал:
CamelContext context = new DefaultCamelContext();
final HttpComponent http = (HttpComponent) context.getComponent("https4");
http.setConnectionsPerRoute(1);
http.setMaxTotalConnections(1);
HttpConfiguration httpConfiguration = new HttpConfiguration();
http.setHttpConfiguration(httpConfiguration);;
context.addComponent("fcpHttpComponent", http);
template = context.createProducerTemplate();
headers.put(Exchange.CONTENT_TYPE, "application/json");
headers.put(Exchange.HTTP_METHOD, HttpMethods.POST);
final String endpoint = "https://xxx.xxx.xxx.xxx:443";
try {
httpEndpoint = new HttpEndpoint(endpoint, http, new URI(endpoint));
httpEndpoint.configureProperties(headers);
PoolingHttpClientConnectionManager clientConnectionManager = new PoolingHttpClientConnectionManager();
SocketConfig socketConfig = SocketConfig.custom()
.setSoKeepAlive(true)
.setSoReuseAddress(true)
.setTcpNoDelay(true)
.setSndBufSize(10)
.build();
clientConnectionManager.setDefaultSocketConfig(socketConfig);
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
clientBuilder.setMaxConnPerRoute(1);
clientBuilder.setConnectionManager(clientConnectionManager);
clientBuilder.build();
ConnectionKeepAliveStrategy keepAliveStrategy = new DefaultConnectionKeepAliveStrategy();
clientBuilder.setKeepAliveStrategy(keepAliveStrategy );
httpEndpoint.setClientBuilder(clientBuilder);
httpEndpoint.setClientConnectionManager(clientConnectionManager);
template.start();
context.start();
} catch (final Exception e) {
LOG.error("Exception while starting Camel context ", e);
}
//Call this method 5 times
template.asyncRequestBodyAndHeaders(httpEndpoint, message, headers);
Сведения о сертификате SSL приведены в качестве аргументов JVM. Я могу POST-данные, но мне нужно улучшить скорость.
[Обновление] Я использую Apache Tomcat 8 в качестве сервера. Установите следующее в server.xml:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="/x/store.jks" keystorePass="y"
clientAuth="false" sslProtocol="TLS" maxKeepAliveRequests="-1" keepAliveTimeout="-1" />
Есть ли что-то еще, что мне нужно настроить на моем сервере?
1 ответ
Получил работу с компонентом netty4Http. Вот пример кода:
private DataWriter() {
this.context = new DefaultCamelContext();
try {
final NettyHttpComponent nettyHttpComponent = this.context.getComponent("netty4-http",
org.apache.camel.component.netty4.http.NettyHttpComponent.class);
this.context.addComponent("nettyhttpComponent", nettyHttpComponent);
this.template = this.context.createProducerTemplate();
this.headers.put("Content-Type", "application/json");
this.headers.put("CamelHttpMethod", "POST");
String trustCertificate = "&ssl=true&passphrase=" + "123456" + "&keyStoreFile="
+ "C:/Users/jpisaac/certs/publicKey.store"
+ "&trustStoreFile=C:/Users/jpisaac/certs/publicKey.store" ;
this.endpoint = "netty4-http:"+ "https://xx.xx.xx.xx:8443/server"
+ "?useByteBuf=true&disableStreamCache=true&connectTimeout=30000&requestTimeout=30000&reuseChannel=true"
+ "&keepAlive=true&tcpNoDelay=true&sync=false&reuseAddress=true&sendBufferSize=1000"
+ trustCertificate;
this.template.start();
this.context.start();
} catch (final Exception e) {
LOG.error("Exception while starting Camel context ", e);
}
}
public void sendData(final String message) {
try {
CompletableFuture<Object> future=this.template.asyncRequestBodyAndHeaders(this.endpoint, message, this.headers);
System.err.println("Sent data "+message);
} catch (final CamelExecutionException e) {
LOG.error("Error while sending data", e);
}
}