Spring MVC(async)vs Spring WebFlux

时间:2017-10-06 12:54:59

标签: java spring spring-mvc spring-webflux

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

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

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

非常感谢你的时间!

2 个答案:

答案 0 :(得分:29)

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

使用该模型,您需要许多线程来实现并发(因为许多线程可以被阻塞等待I / O)。这会花费资源,而且可以根据您的使用情况进行权衡。

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

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

答案 1 :(得分:0)

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

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

可以从

阅读更多内容