Spring MVC(async)vs Spring WebFlux

Dmi*_*ich 43 java spring spring-mvc spring-webflux

我正在尝试了解Spring WebFlux.到目前为止我发现的东西都是内核反应,没有Servlet API,每个请求没有线程,HTTP 2,服务器推送,应用程序/流+ json.

但是Spring MVC中的异步调用有什么区别?我的意思是在Spring MVC中,当你返回Future,DefferedResult等时,你会在一个单独的线程中执行请求处理程序(控制器方法)中的逻辑,因此你也可以从保存线程池资源以便调度请求中受益.

那么请你强调与此相关的差异吗?为什么WebFlux在这里更好?

非常感谢你的时间!

Bri*_*zel 40

Servlet异步模型在容器线程(1 Servlet请求/线程模型)和应用程序中的请求处理之间引入了异步边界.处理可以在不同的线程上发生或等待.最后,您必须以阻塞方式调度回容器线程并进行读/写(InputStream并且OutputStream本质上是阻止API).

使用该模型,您需要许多线程来实现并发(因为许多线程可以被阻塞等待I/O).这会花费资源,可能需要权衡,具体取决于您的使用案例.

使用非阻塞代码,您只需要几个线程来同时处理大量请求.这是一个不同的并发模型; 像任何模型一样,它带来了好处和权衡.

有关该比较的更多信息,这个Servlet与Reactive堆栈的讨论应该是有意义的.

  • 根据您的回答,我理解您对 DeffferedResult 的担忧包含在这句话中:**最后,您必须分派回容器线程并以阻塞方式读/写(InputStream 和 OutputStream 本质上是阻塞 API)。* * 你想说WebFlux有一些可以异步读/写的神奇套接字吗?是否可以? (3认同)
  • 你能详细说明一下吗?即使对于反应式 webFlux,我们也必须等待写入套接字。据我了解,在 Asyc servlet api 容器线程的情况下,必须将请求传递到应用程序 threadPool 中以等待空闲工作线程,并且在传递该线程后,该线程变得空闲,并且可以在传递该请求后重新用于另一个请求。为什么说**使用那种模型,需要很多线程才能实现并发**? (2认同)
  • 抱歉,我不清楚。在 DefferedResult 的情况下,Tomcat 线程只是将请求传递到应用程序线程池 - 它的操作非常短,因此它已准备好处理另一个请求。webFlux 提供了哪些杀手级功能? (2认同)

Jav*_*ved 8

Servlet API 正在阻塞 I/O,每个 HTTP 请求需要 1 个线程。Spring MVC 异步依赖于 Servlet API,它只提供容器线程和请求处理线程之间的异步行为,而不是端到端的。

另一方面,Spring WebFlux 通过使用 HTTP 套接字并通过套接字一次推送数据块,通过固定数量的线程实现并发。这种机制被称为事件循环,这是Node.js流行的一个想法。这种方法具有可扩展性和弹性。Spring 5 的 spring-webflux 使用事件循环方法来提供异步行为。

更多内容可以从