使用WebFlux阻止I / O操作

问题描述 投票:0回答:2

我们有一个流程,我们希望使用Spring Boot 2 WebFlux进行反应式编程。目前我们没有反应式编程经验。 作为此流程的一部分,我们将创建一个或多个HTTP请求(我猜使用WebClient)并从DB读取一些数据。 我们正在考虑使用AWS DynamoDB,但据我所知,Java SDK不支持反应式API。 这个读取将是一个阻塞I / O操作,我的问题是,使用WebFlux实现此流程的一部分是否有好处?更一般地说,流程中的单个阻塞I / O操作是否消除了我们通过反应式编程实现的所有好处?

java spring-boot reactive-programming nonblocking spring-webflux
2个回答
2
投票

以下内容可能无法完全回答您的问题,但可能会有所帮助。 FAQ中提到了Spring Framework 5中提出的一个问题,即

如果我的数据库没有反应库,该怎么办?

答案是:

处理阻塞和非阻塞代码混合的一个建议是使用微服务边界的功能将阻塞后端数据存储代码与非阻塞前端API分离。或者,您也可以使用工作线程池来阻止操作,从而使主事件循环保持非阻塞状态。

我认为来自Pivotal的人可能是对此提供更多见解的合适人选。


0
投票

根据你的问题,被动是处理阻塞操作的空闲方式,特别是IO(网络,文件等......)

您可以使用以反应方式实现此API的库,或使用反应式api包装阻塞请求,这通常通过将阻塞操作放在另一个线程池上来完成

在春天webflux你可以实现类似的东西

@GetMapping
public Mono<Response> getResponse() {
  return Mono.fromCallable(() -> blockingOp())
    .publishOn(Schedulers.elastic());        
}

在这种情况下publishOn将导致所有这些流程发生在另一个线程上,您可以选择专用线程池作为您的选择

来自docselastic是一个

调度程序,动态创建基于ExecutorService的工作程序并缓存线程池,一旦工作程序关闭就重新使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.