如何增加WebFlux WebClient的吞吐量?

时间:2018-10-08 11:48:16

标签: spring-webflux

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

我的代码如下:

  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方法时 的值(使用 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)。该代码几乎无法运行。我的控制台中充满了异常。

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

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

8毫秒就足够了,但是如果我可以增加频率,那就太好了!谢谢!

2 个答案:

答案 0 :(得分:1)

当您获得java.net.SocketException: Too many open files in system 时,表明您已达到文件描述符数量的限制。

尝试一下:

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

答案 1 :(得分:1)

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

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

通常,您应该使用 id time 0 1 00:04:20 2 2 00:11:21 3 2 03:21:32 限制并发呼叫的数量。 limitRate只是引入了人为的延迟,但没有考虑网络延迟或服务器变慢。

您可以尝试:

delayElements