【发布时间】:2019-04-29 08:20:16
【问题描述】:
我使用reactor-netty 来请求一组 URL。大多数 URL 属于相同的主机。 reactor-netty 似乎为每个 URL 建立了一个全新的 TCP 连接,即使已经为前一个 URL 建立了与主机的连接。当同时建立数百个连接时,一些服务器会断开新连接或开始缓慢响应。
代码示例:
Flux.just(...)
.groupBy(link -> {
String host = "";
try {
host = new URL(link).getHost();
} catch (MalformedURLException e) {
LOGGER.warn("Cannot determine host {}", link, e);
}
return host;
})
.flatMap(group -> {
HttpClient client = HttpClient.create()
.keepAlive(true)
.tcpConfiguration(tcp -> tcp.host(group.key()));
return group.flatMap(link -> client.get()
.uri(link)
.response((resp, cont) -> resp.status().code() == 200 ? cont.aggregate().asString() : Mono.empty())
.doOnSubscribe(s -> LOGGER.debug("Requesting {}", link))
.timeout(Duration.ofMinutes(1))
.doOnError(e -> LOGGER.warn("Cannot get response from {}", link, e))
.onErrorResume(e -> Flux.empty())
.collect(Collectors.joining())
.filter(s -> 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
是否可以使用keep-alive HTTP 客户端通过与主机的同一 TCP 连接在同一主机上请求多个 URL?如果没有,如何限制同时连接到同一台主机的数量或按顺序向同一台主机执行请求(下一个请求只有在收到对上一个响应的响应后)?
我使用Californium-SR6 发布火车。
【问题讨论】:
标签: java project-reactor reactor-netty