Jetty http2, чтобы открыть несколько подключений к одному месту назначения - PullRequest
0 голосов
/ 04 марта 2019

Я использую Jetty-клиент для установления http2-соединений с серверами, на которых включена поддержка http2.Я могу видеть соединения открытия причала по мере необходимости и использовать для обмена данными между конечными точками.Для создания клиента http2 мой фрагмент выглядит следующим образом:

Security.addProvider(new OpenSSLProvider());
SslContextFactory sslContextFactory = new SslContextFactory(true);
sslContextFactory.setProvider("Conscrypt");

sslContextFactory.setProtocol("TLSv1.3");
HTTP2Client http2Client = new HTTP2Client();
http2Client.setMaxConcurrentPushedStreams(1000);
http2Client.setConnectTimeout(30);
http2Client.setIdleTimeout(5);

HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(new HttpClientTransportOverHTTP2(http2Client), sslContextFactory);
httpClient.setMaxConnectionsPerDestination(20);
httpClient.setMaxRequestsQueuedPerDestination(100);
httpClient.start();
httpClient.addBean(sslContextFactory);
httpClient.start();

, а позже я использую созданный выше клиент для обмена запросами http2, например

Request request = httpClient.POST("my url goes here");
request.header(HttpHeader.CONTENT_TYPE, "application/json");
request.content(new StringContentProvider("xmlRequest PayLoad goes here","utf-8"));
ContentResponse response = request.send();
String res = new String(response.getContent());

. Мое требование:запросы мультиплексируются одновременно в один и тот же пункт назначения.Это происходит быстрее, пока нагрузка не станет меньше, но когда нагрузка начинает увеличиваться, время, необходимое для обработки запросов, также начинает увеличиваться (иногда в 10 раз).

В таком случае я хотел бы заставить клиент Jetty открыть несколько TCP-соединений и распределить нагрузку по разным сокетам, а не сжимать все в один и тот же открытый сокет.Я попробовал приведенные ниже настройки уже с другими значениями,

httpClient.setMaxConnectionsPerDestination(20);
httpClient.setMaxRequestsQueuedPerDestination(100);

, но безуспешно.

Является ли причал, соединяет ли соединение, когда в молнии открыто более одного соединения?Есть ли способ открыть несколько соединений TCP и распределить нагрузку так, чтобы время обработки не влияло на время пиковой нагрузки.

Причал - 9.4.15, Провайдер - Conscypt, JDK - jdk.18, OS - Ubuntu / Centos

Заранее спасибо

1 Ответ

0 голосов
/ 05 марта 2019

Jetty's HttpClient, настроенный с использованием транспорта HTTP / 2, будет открывать соединения по мере необходимости, когда число одновременных потоков будет превышено, и это параметр конфигурации на стороне сервера.

Скажем, например, что у вас естьнастроив max_concurrent_streams=1024, вы должны выдвинуть своих клиентов за пределы 1024 одновременных запросов до того, как HttpClient откроет новое соединение.

Иногда клиенту никогда не может быть достигнут большой max_concurrent_streams (например,клиент работает медленнее, чем сервер), поэтому дополнительные соединения никогда не открываются.

Если вы хотите принудительно открыть несколько соединений, вам нужно поиграть с max_concurrent_streams, который является конфигурацией на стороне сервера, иуменьшить его.После этого вы можете поиграть с конфигурацией на стороне клиента, чтобы ограничить клиента, ограничив maxConnectionsPerDestination и maxRequestsQueuedPerDestination.

...