0

为什么 Apache HttpAsyncClient 每秒只发送 10 个请求。我配置错了吗?这是我启动 asyncClient 的方式:

PoolingNHttpClientConnectionManager connManager = null;
    try {
        if (client != null && client.isRunning()) {
            client.close();
        }

        TrustStrategy acceptingTrustStrategy = (certificate, authType) -> true;
        SSLContext sslContext = SSLContexts.custom()
                .loadTrustMaterial(null, acceptingTrustStrategy).build();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
                SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        Registry<ConnectionSocketFactory> socketFactoryRegistry =
                RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslsf).build();

        Registry<SchemeIOSessionStrategy> socketRegistry = RegistryBuilder.<SchemeIOSessionStrategy>create()
                .register("http", NoopIOSessionStrategy.INSTANCE)
                .register("https", new SSLIOSessionStrategy(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER))
                .build();

        connManager = new PoolingNHttpClientConnectionManager(
                new DefaultConnectingIOReactor( IOReactorConfig.custom()
                        .setConnectTimeout( connectionTimeout * 1000 ) //connectTimeout
                        .setSoTimeout( readTimeout * 1000 ) //readTimeout
                        .setIoThreadCount(10000)
                        .build() ), socketRegistry );
    } catch (Exception e) {}

    client = HttpAsyncClients.custom()
            .setMaxConnPerRoute( maxConnsPerRoute )
            .setConnectionManager( connManager )
            .setMaxConnTotal( maxConnections )
            .setKeepAliveStrategy( DefaultConnectionKeepAliveStrategy.INSTANCE )
            .build();

    client.start();

而且,这是我使用它的方式:

for(int i = 0; i < 100; i++) {
     client.execute(request.getHttpPost(), null);
}

我怎样才能达到每秒更多的请求???

4

2 回答 2

2

所有版本的 Apache HttpClient 每秒都可以轻松生成数万个请求。

https://github.com/ok2c/httpclient-benchmark/wiki

性能问题可能与服务器代码或您的应用程序代码有关。

  1. 不要这样做。这太可怕了。不应该使用比系统上的 CPU 内核更多的 I/O 调度线程。除非您有非常充分的理由这样做,否则不要覆盖默认值。

    .setIoThreadCount(10000) // do not do this
    
  2. 如果手动设置连接管理器,则所有连接管理参数都无效。maxConnsPerRoute代码中的和值都maxConnections无效。您需要将它们直接应用到连接管理器。

    .setConnectionManager( connManager ) // if you do this
    .setMaxConnPerRoute( maxConnsPerRoute ) // this has no effect
    .setMaxConnTotal( maxConnections )
    
于 2019-12-08T22:39:04.693 回答
0

非常感谢Okta,根据他的指导,我将此代码添加到我的项目中,问题解决了:

connManager.setMaxTotal(10);
connManager.setDefaultMaxPerRoute(10);
HttpHost host = new HttpHost("75.10.91.11", 8443, "https");
connManager.setMaxPerRoute(new HttpRoute(host), 10);

你可以在baeldung.com找到完整的解释

于 2019-12-10T08:11:36.867 回答