2017-10-06 263 views
3

我想了解Spring WebFlux。到目前为止,我发现的东西在核心是被动的,没有Servlet API,每个请求没有线程,HTTP 2,服务器推送,应用程序/流+ json。春季MVC(异步)与春季WebFlux

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

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

非常感谢您的时间!

+1

反应式编程是推动式驱动的并且使用单个调度程序线程(这是高效的),而旧模型仍然限制在线程池中的线程数。 –

+0

@M。 Deinum但在这种情况下,我受限于一个线程可以处理的负载。为什么不使用它们中的几个,而不仅仅是一个具有多核系统的系统? –

+1

这是一个事件调度程序线程,它是一个完全不同的模型。它只发送事件(非常快),而另一个模型仍然阻塞。 –

回答

3

Servlet异步模型在容器线程(1个Servlet请求/线程模型)和应用程序中的请求处理之间引入了异步边界。处理可以发生在不同的线程上或等待。最后,你必须发回一个容器线程并以阻塞的方式读/写(InputStreamOutputStream固有地阻塞了API)。使用该模型,需要多个线程来实现并发(因为其中许多线程可能会被阻塞以等待I/O)。这会花费资源,这可能是一种折衷,取决于您的使用情况。

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

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

+1

感谢您的答案和有用的链接! –