Java reactor netty:使用保持活动的HTTP客户端

Java reactor netty:使用保持活动的HTTP客户端,java,project-reactor,reactor-netty,Java,Project Reactor,Reactor Netty,我使用reactor netty请求一组URL。大多数URL属于相同的主机reactor netty似乎为每个URL建立了一个全新的TCP连接,即使已经为以前的URL建立了到主机的连接。当数百个连接同时建立时,一些服务器会断开新连接或开始缓慢响应 代码示例: Flux.just(…) .groupBy(链接->{ 字符串host=“”; 试一试{ host=新URL(link).getHost(); }捕获(格式错误){ warn(“无法确定主机{}”,link,e); } 返回主机; }) .

我使用
reactor netty
请求一组URL。大多数URL属于相同的主机
reactor netty
似乎为每个URL建立了一个全新的TCP连接,即使已经为以前的URL建立了到主机的连接。当数百个连接同时建立时,一些服务器会断开新连接或开始缓慢响应

代码示例:

Flux.just(…)
.groupBy(链接->{
字符串host=“”;
试一试{
host=新URL(link).getHost();
}捕获(格式错误){
warn(“无法确定主机{}”,link,e);
}
返回主机;
})
.flatMap(组->{
HttpClient=HttpClient.create()
.keepAlive(对)
.tcpConfiguration(tcp->tcp.host(group.key());
returngroup.flatMap(link->client.get())
.uri(链接)
.response((resp,cont)->resp.status().code()==200?cont.aggregate().asString():Mono.empty())
.doOnSubscribe(s->LOGGER.debug(“请求{}”,链接))
.超时(持续时间为分钟(1))
.doOnError(e->LOGGER.warn(“无法从{}获取响应”,链接,e))
.onErrorResume(e->Flux.empty())
.collect(收集器.joining())
.filter->StringUtils.isNotBlank(s));
})
.blockLast();
在日志中,我看到同一远程主机的本地端口不同,活动和非活动连接的总和远远高于不同主机的数量。这就是为什么我认为
reactor netty
没有重用已经建立的连接

DEBUG [2019-04-29 08:15:18,711] reactor-http-nio-10 r.n.r.PooledConnectionProvider: [id: 0xaed18e87, L:/192.168.1.183:56832 - R:capcp2.naad-adna.pelmorex.com/52.242.33.4:80] Releasing channel
DEBUG [2019-04-29 08:15:18,711] reactor-http-nio-10 r.n.r.PooledConnectionProvider: [id: 0xaed18e87, L:/192.168.1.183:56832 - R:capcp2.naad-adna.pelmorex.com/52.242.33.4:80] Channel cleaned, now 1 active connections and 239 inactive connections
...
DEBUG [2019-04-29 08:15:20,158] reactor-http-nio-10 r.n.r.PooledConnectionProvider: [id: 0xd6c6c5db, L:/192.168.1.183:56965 - R:capcp2.naad-adna.pelmorex.com/52.242.33.4:80] Releasing channel
DEBUG [2019-04-29 08:15:20,158] reactor-http-nio-10 r.n.r.PooledConnectionProvider: [id: 0xd6c6c5db, L:/192.168.1.183:56965 - R:capcp2.naad-adna.pelmorex.com/52.242.33.4:80] Channel cleaned, now 0 active connections and 240 inactive connections
是否可以通过与主机的相同TCP连接,使用
keep alive
HTTP客户端在同一主机上请求多个URL?如果没有,我如何限制到同一主机的同时连接的数量,或者按顺序执行到同一主机的请求(只有在收到对上一个主机的响应后才执行下一个请求)


我使用的是加州SR6释放序列。

是的,reactor netty支持保持活动、连接重用和连接池

请注意,
.flatMap
是一个异步操作,并行处理内部流。因此,当您调用
group.flatMap(…
时,内部请求将并行执行。由于它们是并行执行的,因此需要建立多个连接

如果要按顺序执行对同一主机的请求,请将示例更改为使用
group.concatMap
而不是
.flatMap

如果您仍希望并行执行它们,但将活动请求的数量限制在单个主机上,那么请更改示例以使用带有
并发性
参数的
.flatMap
重载版本之一


另外,由于您使用的是
HttpClient.create()
,因此您的示例使用默认的全局http连接池。如果您希望对连接池进行更多控制,可以通过
HttpClient.create(ConnectionProvider)指定不同的连接池

是的,reactor netty支持保持活动、连接重用和连接池

请注意,
.flatMap
是一个异步操作,并行处理内部流。因此,当您调用
group.flatMap(…
时,内部请求将并行执行。由于它们是并行执行的,因此需要建立多个连接

如果要按顺序执行对同一主机的请求,请将示例更改为使用
group.concatMap
而不是
.flatMap

如果您仍希望并行执行它们,但将活动请求的数量限制在单个主机上,那么请更改示例以使用带有
并发性
参数的
.flatMap
重载版本之一

另外,由于您使用的是
HttpClient.create()
,因此您的示例使用默认的全局http连接池。如果您希望对连接池进行更多控制,可以通过
HttpClient.create(ConnectionProvider)
指定其他连接池