2017-04-07 20 views
0

Camelを使用してHTTPSサーバーに非常に速い速度(> 1500 /秒)でサーバーへの接続を1つだけ使用してPOSTメッセージを送信できます。KeepAliveでCamel HTTP4を最適化する

私はkeepAliveをtrueに設定しようとしましたが、それでもスピードの向上は見られません。

5つのメッセージを送信中にtcpdumpを実行し、wiresharkで5つのSYN/ACKパケットを検出しました。 各POSTでSSL証明書が送信されている可能性があります。 (tcpdumpでキャプチャされた102パケットですが、送信するのは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" /> 

は、私も自分のサーバー上で設定する必要が何か他のものはありますか?

答えて

0

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); 
} 
} 
関連する問題