Почему 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);
}

Как я могу добиться большего количества запросов в секунду ???

0
hossein sargazi moghaddam 8 Дек 2019 в 10:41

2 ответа

Все версии Apache HttpClient могут легко генерировать десятки тысяч запросов в секунду.

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

Проблема с производительностью, скорее всего, связана либо с серверным кодом, либо с кодом вашего приложения.

  1. Не делайте этого. Это ужасно. Не следует использовать больше потоков диспетчеризации ввода-вывода, чем имеется ядер ЦП в системе. Не отменяйте значение по умолчанию, если у вас нет для этого очень веских причин.

    .setIoThreadCount(10000) // do not do this
    
  2. Если вручную установить диспетчер соединений, все параметры управления соединениями не действуют. Оба значения maxConnsPerRoute и maxConnections в вашем коде не действуют. Их нужно применить непосредственно к диспетчеру соединений.

    .setConnectionManager( connManager ) // if you do this
    .setMaxConnPerRoute( maxConnsPerRoute ) // this has no effect
    .setMaxConnTotal( maxConnections )
    
2
ok2c 9 Дек 2019 в 01:39
Благодарю за ваш ответ. только один вопрос: в теме 'stackoverflow.com/questions/ 34505271 /… », они сказали, что: По умолчанию HttpAsyncClient разрешает только два одновременных подключения к одному и тому же хосту в соответствии со спецификацией RFC 2616. Это правильно? потому что я отправляю все запросы на один и тот же хост.
 – 
hossein sargazi moghaddam
9 Дек 2019 в 11:33
Это правильно. HttpAsyncClient 4.1.x по умолчанию использует только два одновременных подключения. Если вы хотите увеличить это число, вы можете сделать это через интерфейс ConnPoolControl, реализованный диспетчером соединений.
 – 
ok2c
9 Дек 2019 в 11:37
Спасибо большое за вашу помощь. Основываясь на вашем предложении, я могу отправить больше запросов по конкретному маршруту, и это решило мою проблему.
 – 
hossein sargazi moghaddam
10 Дек 2019 в 10:58

Большое спасибо 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

0
hossein sargazi moghaddam 10 Дек 2019 в 14:51