Spring MVC(异步)与 Spring WebFlux

Spring MVC (async) vs Spring WebFlux

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

但是SpringMVC中的异步调用有什么区别呢?我的意思是,在 Spring MVC 中,当你 return Future、DefferedResult 等时,你会在请求处理程序(控制器方法)中获得在单独线程中执行的逻辑,因此你可以从节省线程池资源以分派请求中获益以及。

那么您能否强调与此相关的不同之处?为什么 WebFlux 在这里更好?

非常感谢您的宝贵时间!

Servlet 异步模型在容器线程(1 个 Servlet request/thread 模型)和应用程序中的请求处理之间引入了异步边界。处理可以发生在不同的线程或等待。最后,您必须以阻塞方式分派回容器线程和 read/write(InputStreamOutputStream 本质上是阻塞 API)。

使用该模型,您需要许多线程才能实现并发(因为其中许多可能会阻塞等待 I/O)。这会消耗资源,并且可能是一种权衡,具体取决于您的用例。

使用非阻塞代码,您只需要几个线程即可同时处理大量请求。这是一个不同的并发模型;与任何模型一样,它也有好处和权衡。

有关该比较的更多信息,Servlet vs. Reactive stacks talk 应该很有趣。

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

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

更多内容可阅读