【问题标题】:Spring Mvc with async support vs Spring WebFlux具有异步支持的 Spring Mvc 与 Spring WebFlux
【发布时间】:2018-08-26 23:10:35
【问题描述】:

据我所知(如果我错过了,请添加)当我们使用 Spring MVC 应用程序时,当请求来自我们的服务器(Tomcat ...)时,我们有一个线程池来自池处理这个请求的线程之一,有时这很糟糕,因为如果任务需要很长时间,我们的线程将一直很忙,为了避免这种行为,我们可以将控制器的返回类型从示例字符串更改为 Callable<String>DefferedResult<String>,现在来自 tomcat 的工作线程从 ExecutorService(我们在@Configuration 类中配置)给线程执行,它更好,因为 tomcat 线程可以处理其他请求并且不会等待每个请求的执行。 但我不明白 WebFlux 的想法。正如我从官方文档中了解到的那样,我们有一个处理所有请求的单线程,然后(我不明白如何)返回响应,但是如果一个请求等待长任务(查询到数据库),这是否意味着该线程将等到当前任务完成,否则它会为此任务创建新线程,如果是,它与 Callable 和 DeferedResult 有何不同?

提前致谢

【问题讨论】:

  • 据我所知,这是一个冗长而漫无边际的问题,我没有做到最后 - 但也许有人可以。如果是这样,我希望他们能够以官方文档无法帮助您理解的方式。

标签: java spring-mvc spring-webflux


【解决方案1】:

这个视频:

https://www.infoq.com/presentations/servlet-reactive-stack

解释如何在 servlet 和响应式堆栈中处理请求,以及响应式方法的好处。

还有一个很好的解释为什么 RxJava(另一个反应式库)比 Futures 更好:

http://reactivex.io/intro.html

Java Futures 之类的技术可以直接用于单个 异步执行级别,但它们开始添加非平凡的 嵌套时的复杂性。

很难使用 Futures 来优化组合条件 异步执行流程(或不可能,因为每个 请求在运行时有所不同)。这当然可以完成,但很快 变得复杂(因此容易出错)或过早阻塞 Future.get(),它消除了异步执行的好处。

另一方面,ReactiveX Observables 旨在用于组合 异步数据的流和序列。

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 2014-09-17
    相关资源
    最近更新 更多