首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reactor-netty:使用keep-alive HTTP客户端

reactor-netty:使用keep-alive HTTP客户端
EN

Stack Overflow用户
提问于 2019-04-29 16:20:17
回答 1查看 3.6K关注 0票数 0

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

代码示例:

代码语言:javascript
复制
    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没有重用已经建立的连接。

代码语言:javascript
复制
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连接在同一主机上请求多个URL?如果不是,如何限制同一台主机的并发连接数,或者按顺序向同一台主机发出请求(下一次请求仅在收到对上一次请求的响应后)?

我使用Californium-SR6发布系列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-05 08:03:21

是的,reactor netty支持keep-alive、连接重用和连接池。

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

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55899414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档