使用 WebFlux 阻止 I/O 操作

Yos*_*sha 6 java nonblocking reactive-programming spring-boot spring-webflux

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

sha*_*haf 5

根据你的问题,反应式是处理阻塞操作尤其是IO(网络、文件等......)的空闲方法

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

在 spring webflux 中你可以实现类似的东西

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

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

文档来看,elastic是一个

调度程序动态创建基于 ExecutorService 的 Workers 并缓存线程池,并在 Workers 关闭后重用它们。


une*_*q95 3

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

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

这个问题的答案是:

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

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