Jetty http2打开到同一目的地的多个连接

问题描述 投票:0回答:1

我正在使用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());

我的要求是,将有100个请求同时复用到同一目的地。它的速度越快,直到负载越来越小,但当负载开始增加时,处理请求所花费的时间也开始增加(有时是10倍)。

在这种情况下,我想强制jetty客户端打开多个tcp连接并将负载分配到不同的套接字,而不是将所有内容压缩到相同的打开套接字。我已经使用不同的值尝试了以下设置,

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

没有运气。

当在码头打开多个连接时,码头是否连接合并?有没有办法打开多个TCP连接并分配负载,以便处理时间不受峰值加载时间的影响。

Jetty - 9.4.15,提供商 - Conscypt,JDK - jdk.18,OS- Ubuntu / Centos

提前致谢

java jetty http2 jetty-9 jetty-8
1个回答
2
投票

配置了HTTP / 2传输的Jetty的HttpClient将在超过并发流数时根据需要打开连接,这是服务器端配置参数。

例如,您已经配置了max_concurrent_streams=1024,在HttpClient打开新连接之前,您必须将客户端推送到超过1024个并发请求。

有时客户端永远无法访问大型max_concurrent_streams(例如,客户端比服务器慢),因此永远不会打开其他连接。

如果要强制打开多个连接,则必须使用max_concurrent_streams(服务器端配置)并减少它。之后,您可以通过限制maxConnectionsPerDestinationmaxRequestsQueuedPerDestination来使用客户端配置来限制客户端。

© www.soinside.com 2019 - 2024. All rights reserved.