在非阻塞异步服务上调用阻塞端点

Calling blocking endpoint on non-blocking asynchronous service

如果我的反应性端点需要调用一个外部的、非反应性端点,它会阻塞东西,我的反应性端点是否仍然是反应性的?

我有 2 个服务 运行 可以利用 Spring Boot MVC 和 Spring Webflux。

服务A Spring Webflux

服务B SpringMVC

现在我的服务 A 正在响应调用阻塞的服务 B 端点。我的服务A会不会受到影响,不响应?

如果是?如何解决这种情况,使我的反应性端点保持反应性?

如果使用 webflux 将服务 A 编写为反应式服务,则无论调用的是谁,它都将始终保持反应式。

我假设我们正在谈论 http/https 现在使用 webclient

关于反应式的事情是,如果服务 B 的响应速度很慢,您的服务 A 将不会让调用线程等待响应,相反,服务 A 的线程将在等待响应时去做其他事情来自服务 b 的响应,当响应返回时,任何线程都可以获取响应并继续。

如果反应式服务仅调用其他反应式服务,则它不是反应式的。它总是反应性的。因为它对事件做出反应。

有一些注意事项。例如,如果您正在与数据库对话,此处的数据库驱动程序需要是遵循 R2DBC 规范的特定驱动程序。

您看到有关如何编写数据库驱动程序的传统 JDBC 规范设计为固有阻塞。如果您遵循规范并编写了一个驱动程序,该驱动程序将自动必须阻塞。你别无选择。

因此 spring 创建了一个新规范 (R2DBC),它本质上不是阻塞的,因此您需要一个符合该规范的驱动程序。否则您的服务将受到阻塞行为的影响。

但是你的问题的答案是。

不,如果我们正在从一项服务到另一项服务进行 http 通信。