【问题标题】:Optimizing Camel HTTP4 with KeepAlive使用 KeepAlive 优化 Camel HTTP4
【发布时间】:2017-09-02 18:18:58
【问题描述】:

我希望能够使用 Camel 以相当快的速度(> 1500/秒)将消息 POST 到 HTTPS 服务器,只使用一个到服务器的连接。

我尝试将 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 参数给出。我可以发布数据,但速度需要改进。

[更新] 我使用 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" />

我还需要在我的服务器上配置其他东西吗?

【问题讨论】:

    标签: tomcat https apache-camel keep-alive camel-http


    【解决方案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);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多