覆盖 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 执行器的效果如何?的主要内容,如果未能解决你的问题,请参考以下文章
212. Spring Boot WebFlux:响应式Spring Data之MongoDB
为啥spring webflux默认选择jetty然后失败?
为啥默认配置的spring webflux中没有异常堆栈跟踪?
Spring Boot 自动配置的 Jackson ObjectMapper 默认不用于 WebFlux WebClient