Spring MVC (异步) VS Spring WebFlux

我在试着理解 Spring WebFlux。到目前为止,我发现核心是反应性的,没有 Servlet API,每个请求没有线程,HTTP 2,服务器推送,应用程序/流 + json。

但是在 Spring MVC 中异步调用之间的区别是什么?我的意思是,在 Spring MVC 中,当您返回 Future、 DefferedResult 等时,您将获得在单独线程中执行的请求处理程序(控制器方法)中的逻辑,因此您也可以从为分派请求而节省线程池资源中获益。

所以你能不能强调一下这方面的不同之处? 为什么 WebFlux 在这里更好?

非常感谢您的宝贵时间!

31713 次浏览

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

使用这种模型,您需要许多线程来实现并发性(因为其中许多线程可能会被阻塞,等待 I/O)。这会消耗资源,而且根据用例的不同,这可能是一种权衡。

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

要了解更多关于这种比较的信息,这个 Servlet 与 Reactive 堆栈之间的对话应该是有趣的。

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

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

更多信息可以从