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)
指定其他连接池