使用WebFlux阻止I / O操作

时间:2018-10-23 09:31:31

标签: java spring-boot reactive-programming nonblocking spring-webflux

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

2 个答案:

答案 0 :(得分:2)

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

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

答案是:

  

关于处理阻塞代码和非阻塞代码的一个建议   将使用微服务边界的力量来分离   来自非阻塞式前端API的阻塞式后端数据存储区代码。   或者,您也可以使用工作线程池进行阻止   操作,以确保主事件循环不会那样阻塞。

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

答案 1 :(得分:0)

Based on your question reactive is the idle way to deal with blocking operation especially IO (network, file and etc...)

you can use a library that implements this api in a reactive way or wrap a blocking request with a reactive api, this usually done by placing the blocking op on anther thread pool

in spring webflux you can achieve something similar like

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

publishOn in that case will cause all this flow to happen on another thread, you can choose dedicated thread pool as your choice

from the docs, elastic is a

Scheduler that dynamically creates ExecutorService-based Workers and caches the thread pools, reusing them once the Workers have been shut down.