如何增加 WebFlux WebClient 的吞吐量?

How to increase WebFlux WebClient's throughput?

我想发送一些请求并高频接收响应。

我的代码如下:

  Flux.fromIterable(params)
            .delayElements(Duration.ofMillis(8))
            .subscribe(
              param -> {
                webClient
                    .get()
                    .uri(prefix.concat(Utils.urlEncoder(param)))
                    .header("K1", "V1"))
                    .exchange()
                    .subscribe(clientResponse -> {
                        log.info("");
                    });
            }
        );

代码运行良好,当我尝试更改delayElements方法时,频率为good.But 的值(使用Duration.ofMillis(4)),我发现了一些异常。

    ERROR [reactor-http-nio-2] ContextHandler --- Error cannot be forwarded to user-facing Mono
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.io.IOException: Connection closed prematurely
Caused by: java.io.IOException: Connection closed prematurely

代码仍然可以运行,但它产生了一些异常。

之后我将值减小到 Duration.ofMillis(0)。代码几乎不可能 run.My 控制台充满异常。

Caused by: java.net.SocketException: Too many open files in system

我可以使代码的吞吐量 会更好吗?

8毫秒就够了,但如果我能提高频率,那就太好了!谢谢!

当你得到java.net.SocketException: Too many open files in system 时,这意味着你已经达到了文件描述符的数量限制。

试试这个:

https://unix.stackexchange.com/questions/84227/limits-on-the-number-of-file-descriptors

在这种情况下,可能会发生以下几种情况:

  • 如果您正在对远程主机进行洪泛攻击,该主机可能会认为您正在尝试进行 DoS 攻击并会关闭传入连接
  • 您的本地主机可能 运行 文件描述符不足,因为您创建了太多连接

一般情况下,您应该使用limitRate来限制并发调用数。 delayElements 只是引入了人为延迟,但没有考虑网络延迟或您的服务器变慢。

您可以试试:

Flux.fromIterable(params)
    .limitRate(25)
    .flatMap(param -> webClient
                         .get()
                         .uri(prefix.concat(Utils.urlEncoder(param)))
                         .header("K1", "V1"))
                         .exchange()
    )
    .subscribe(clientResponse -> { log.info(""); }, error -> { log.error(e); });