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

时间:2019-03-04 14:47:08

标签: java jetty http2 jetty-9 jetty-8

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

预先感谢

1 个答案:

答案 0 :(得分:2)

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

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

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

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