我试图了解Spring WebFlux。到目前为止我发现的东西在核心是反应性的,没有Servlet API,每个请求没有线程,HTTP 2,服务器推送,应用程序/流+ json。
但是Spring MVC中的异步调用有什么区别?我的意思是在Spring MVC中,当你返回Future,DefferedResult等时,你会在一个单独的线程中执行请求处理程序(控制器方法)中的逻辑,因此你也可以从保存线程池资源以便调度请求中受益。
那么请你强调与此相关的差异?为什么WebFlux在这里更好?
非常感谢你的时间!
答案 0 :(得分:29)
Servlet异步模型在容器线程(1个Servlet请求/线程模型)和应用程序中的请求处理之间引入了异步边界。处理可以在不同的线程上发生或等待。最后,您必须发送回容器线程并以阻塞方式进行读/写(InputStream
和OutputStream
本身就是阻止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使用事件循环方法提供异步行为。可以从
阅读更多内容