Webflux并行连接以某种方式限制为256

时间:2018-08-30 13:35:44

标签: 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.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));
}

这两件事都是靠净值运行的。也许有人知道是什么原因导致了这种行为?

1 个答案:

答案 0 :(得分:1)

这不是由于对连接池的限制sys.user$,但这实际上来自您可以更改的Reactor实现细节。

默认情况下,诸如WebClient之类的Reactor运算符具有flatMap(我们在最终用户请求元素之前请求的元素数量)和prefetch=32(同时处理的最大元素数量)由操作员)。

您可以使用maxConcurrency=256的变体来更改该行为。

您的代码段混合使用了Flux.flatMap(Function mapper, int concurrency, int prefetch)subscribeOn;我想说的是,鉴于您正在使用此代码段进行响应式I / O工作,因此您不应尝试在弹性/并行调度程序上调度工作。最好在这里删除这些运算符。