覆盖 Spring webflux 项目的默认 Threadpool 执行器的效果如何?

Posted

技术标签:

【中文标题】覆盖 Spring webflux 项目的默认 Threadpool 执行器的效果如何?【英文标题】:How effective to override the default Threadpool executor for Spring webflux project? 【发布时间】:2019-10-04 05:25:25 【问题描述】:

我是 Spring-Webflux 的新手。

我在 2 核处理器中运行以下示例项目。我的 RESTful api 会调用外部 api,外部 api 响应小于 500ms。

当我使用 jMeter 进行负载测试时,无法达到超过 15 TPS。

下面的设计是否遗漏了什么或有什么问题?

在 Webflux 项目中覆盖默认的 Threadpool 执行器效果如何?

提前谢谢你。

Controller.java ----------------

查找控制器 @Autowired 私有 LookupService 查找服务; @PostMapping(value = "/findOrder") public Mono> findOrder(@RequestBody InputBean inputBean)

返回lookupService.findOrder(inputBean) .map(resp -> ResponseEntity.ok(resp)) .defaultIfEmpty(ResponseEntity.notFound().build());

服务 ---------

@服务 公共类 LookupService 私人 RestWorker restWorker; public Mono findOrder(InputBean inputBean) ..//基本验证 ApiBean apiBean = restWorker.buildApiBean(inputBean); Mono responseStr = restWorker.callApi(apiBean); 返回 responseStr.flatMap(resp -> //业务逻辑 //处理api响应并创建对应的Controller Response 返回 Mono.just(controllerResponse); );

助手 ---------

@组件 公共 RestWorker

私有网络客户端 webClient = null;

@PostConstruct 私有 void initWorker() webClient = WebClient.builder() .baseUrl(httpUrl) .defaultHeader(HttpHeaders.CONTENT_TYPE, "application/json") .defaultHeader(HttpHeaders.ACCEPT, "application/json") .defaultHeader(HttpHeaders.ACCEPT_CHARSET, "UTF-8") .build();

公共 ApiBean buildApiBean(InputBean inputBean) // 根据输入 bean + 配置值创建 ApiBean .... 返回 apiBean;

公共 Mono callApi(ApiBean apiBean) 单声道响应MonoStr = null; 试试 responseMonoStr = webClient.post() .uri(url_tibco) .body(BodyInserters.fromObject(reqDoc)) .exchange() .timeout(Duration.ofMillis(socketReadTimeout)) .flatMap(clientResponse -> System.out.println(Thread.currentThread().getName() + "状态 代码:" + clientResponse.statusCode()); return clientResponse.bodyToMono(String.class); ); catch(异常异常) 返回 Mono.just("");

【问题讨论】:

【参考方案1】:

不是,因为 Spring WebFlux 没有使用 Threadpool 执行器来分派 Web 请求。而是使用其他服务器资源,例如事件循环(用于 Netty)。有关这方面的更多信息,您可以查看the Spring Boot reference documentation on reactive server resources,更重要的是了解the concurrency model in Spring WebFlux。

【讨论】:

非常感谢。但是,为什么我的 TPS 很低?是我的设计缺陷还是我如何有效地处理并行请求?请分享您宝贵的cmets。【参考方案2】:

布赖恩·克洛泽,

非常感谢。非阻塞 api 基于事件循环,线程数很少。但是,当我发送一些并行请求时,它会打开 2 个不同的线程,例如 reactor-http-nio-2、reactor-http-nio-3..

为什么它在每个并行请求上打开不同的线程?

【讨论】:

以上是关于覆盖 Spring webflux 项目的默认 Threadpool 执行器的效果如何?的主要内容,如果未能解决你的问题,请参考以下文章

211. Spring Boot WebFlux:使用篇

212. Spring Boot WebFlux:响应式Spring Data之MongoDB

为啥spring webflux默认选择jetty然后失败?

为啥默认配置的spring webflux中没有异常堆栈跟踪?

Spring Boot 自动配置的 Jackson ObjectMapper 默认不用于 WebFlux WebClient

未抛出 spring webflux 的自定义异常