Spring boot Webflux并行连接以某种方式限制为256个
我有一个简单的服务器和客户端设置:Spring boot Webflux并行连接以某种方式限制为256个,spring-boot,netty,spring-webflux,Spring Boot,Netty,Spring Webflux,我有一个简单的服务器和客户端设置: Flux.range(1, 5000) .subscribeOn(Schedulers.parallel()) .flatMap(i -> WebClient.create() .method(HttpMethod.POST) .uri("http://localhost:8080/test") .body(Mono.just(String.value
Flux.range(1, 5000)
.subscribeOn(Schedulers.parallel())
.flatMap(i -> WebClient.create()
.method(HttpMethod.POST)
.uri("http://localhost:8080/test")
.body(Mono.just(String.valueOf(i)), String.class)
.exchange())
.publishOn(Schedulers.parallel())
.subscribe(response ->
response.bodyToMono(String.class)
.publishOn(Schedulers.elastic())
.subscribe(body -> log.info("{}", body)));
以下是客户:
@PostMapping
public Mono<String> test(@RequestBody Mono<String> body) {
return body.delayElement(Duration.ofSeconds(5));
}
@PostMapping
公共单体测试(@RequestBody单体){
返回body.delayElement(持续时间为秒(5));
}
这两件事都很棘手。也许有人知道是什么导致了这种行为?这并不是因为
WebClient对连接池的限制,但这实际上来自一个可以更改的反应器实现细节
默认情况下,反应器操作符(如flatMap
)具有prefetch=32
(我们在最终订户请求之前请求的元素数)和maxConcurrency=256
(操作符并发处理的最大元素数)
您可以使用Flux.flatMap(函数映射器、int并发、int预取)
的变体来更改该行为
您的代码片段混合使用了
subscribeOn
和publishOn
;我要说的是,鉴于您正在使用此代码段进行反应式I/O工作,您不应该尝试在弹性/并行调度器上安排工作。删除这些操作符在这里是最好的。谢谢,伙计,我想我应该在做其他事情时离开http nio线程。