【问题标题】:Calling blocking endpoint on non-blocking asynchronous service在非阻塞异步服务上调用阻塞端点
【发布时间】:2022-01-21 13:23:34
【问题描述】:

如果我的反应式端点需要调用一个外部的、非反应式的端点来阻止事情,我的反应式端点仍然是反应式的吗?

我有 2 个服务正在运行,它们利用 Spring Boot MVC 和 Spring Webflux。

服务 A Spring Webflux

服务 B 春季MVC

现在我的服务 A 响应调用阻塞的服务 B 端点。我的服务 A 会受到影响并且无法响应吗?

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

【问题讨论】:

    标签: java spring-boot reactive-programming spring-webflux project-reactor


    【解决方案1】:

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

    我假设我们现在使用的是 http/https,例如 webclient

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

    如果一个反应式服务只调用其他反应式服务,它就不是反应式的。它总是被动的。就像它对事件做出反应一样。

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

    您会看到关于如何编写数据库驱动程序的传统 JDBC 规范被设计为天生是阻塞的。如果您遵循规范并编写了驱动程序,则驱动程序将自动必须阻塞。你别无选择。

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

    但你的问题的答案是。

    不,如果我们是从一个服务到另一个服务的 http。

    【讨论】:

    • 感谢您的回复。
    • 1.) 如果我的 http 阻塞服务需要时间来返回结果,是否有必要创建调度程序线程来处理我的反应式服务中的此类阻塞调用? 2.) 我正在尝试在我的微服务架构中创建一个 API 服务,该服务将处理 100 多个其他阻塞服务。现在我不希望我的 API 服务通过为每个请求模型创建线程来挂起其他阻塞服务的结果,因此我试图让我的 API 服务响应以限制线程创建的数量?你能建议并帮助我更好的方法吗? @Toerktumlare
    • 请不要在 cmets 中问更多问题,stackoverflow 不是一个讨论论坛,它是一个问答网站。如果您想了解更多信息,我建议您阅读spring reactor documentation,因为它将了解所有这些基础知识。或者你发现不和谐、reddit 等
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多