Spring MVC (async) vs Spring WebFlux

2022-08-31 13:52:58

我试图理解Spring WebFlux。到目前为止,我发现的东西是核心的响应式,没有Servlet API,没有每个请求的线程,HTTP 2,服务器推送,application/stream+json。

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

那么,您能否强调一下与此相关的差异?为什么WebFlux在这里更好?

非常感谢您抽出宝贵时间接受采访!


答案 1

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

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

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

有关该比较的更多信息,应该对此 Servlet 与反应式堆栈的讨论感兴趣。


答案 2

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

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

更多内容可从中读取


推荐