如何增加 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); });
我想发送一些请求并高频接收响应。
我的代码如下:
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); });