我正在使用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
提前致谢
配置了HTTP / 2传输的Jetty的HttpClient
将在超过并发流数时根据需要打开连接,这是服务器端配置参数。
例如,您已经配置了max_concurrent_streams=1024
,在HttpClient
打开新连接之前,您必须将客户端推送到超过1024个并发请求。
有时客户端永远无法访问大型max_concurrent_streams
(例如,客户端比服务器慢),因此永远不会打开其他连接。
如果要强制打开多个连接,则必须使用max_concurrent_streams
(服务器端配置)并减少它。之后,您可以通过限制maxConnectionsPerDestination
和maxRequestsQueuedPerDestination
来使用客户端配置来限制客户端。