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