我正在使用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倍)。
在这种情况下,我想强制码头客户端打开多个tcp连接,并将负载分配到不同的套接字,而不是将所有内容都挤压到同一打开的套接字。我已经尝试了以下具有不同值的设置,
httpClient.setMaxConnectionsPerDestination(20);
httpClient.setMaxRequestsQueuedPerDestination(100);
没有运气。
在码头中打开多个连接时,码头会合并吗?有没有一种方法可以打开多个tcp连接并分配负载,以使处理时间在高峰负载时间不受影响。
码头-9.4.15, 提供者-Conscypt, JDK-jdk.18, 操作系统-Ubuntu / Centos
预先感谢
答案 0 :(得分:2)
使用HTTP / 2传输配置的Jetty的HttpClient
将在超过并发流数时根据需要打开连接,这是服务器端配置参数。
例如,您已经配置了max_concurrent_streams=1024
,则必须在HttpClient
打开新连接之前将客户端推到1024个并发请求之外。
有时max_concurrent_streams
不能被客户端访问(例如,客户端比服务器慢),因此永远不会打开其他连接。
如果要强制打开多个连接,则必须使用max_concurrent_streams
(这是服务器端配置),然后减少它。
之后,您可以使用客户端配置来限制maxConnectionsPerDestination
和maxRequestsQueuedPerDestination
来限制客户端。