Spring Web MVC与Spring WebFlux的对比。阻塞和非阻塞

7

我刚接触Spring,正在阅读一本书《Pro Spring boot 2》。它说Spring Web MVC对每个请求都有一些阻塞,而Spring Webflux则是完全非阻塞的堆栈。

  1. 请告诉我这是什么意思?
  2. 发往Spring MVC的请求会激活一个线程来执行此请求。什么时候以及为什么会被阻塞?
  3. 为什么Spring WebFlux不会阻塞线程?
1个回答

11
  1. Spring Web MVC使用单个线程来处理API的每个请求。而Spring Webflux不会阻塞线程以处理每个请求,因为没有线程等待完成某些操作(例如,从数据库等待答案)。
  2. 正如1中所述,它可能在等待从数据库或通过HTTP调用的另一个服务的答案时被阻塞。
  3. Spring Webflux利用反应式堆栈(请参见https://projectreactor.io/),这是完全非阻塞的。这意味着没有线程被阻塞等待某些事情发生。一切都基于反应流发布器(MonoFlux),使您的代码对数据的到达做出反应(例如,从数据库或通过HTTP调用的另一个服务)。

1
你的意思是说,如果一个服务方法睡眠了这个方法10分钟,而且同时有2个用户向服务器发送了2个请求,那么这2个请求将在2*10=20分钟后执行吗? - Rashid Khaziev
1
如果您的服务由单个线程处理,则这是正确的。 - João Dias
那么实际情况是怎样的呢?不可能只有一个线程处理所有请求。否则,Spring MVC就不会如此受欢迎,也不会在生产环境中被使用。是否有线程池?例如,线程池中有1000个线程。如果用户发送了1000个请求,则所有线程都将被使用,第1001个请求将等待直到其中一个线程空闲。 - Rashid Khaziev
3
是的,有一个线程池。这就是为什么即使使用Spring MVC,您的应用程序也能够回答多个请求的原因。但是,Spring MVC存在的问题是如果您的应用程序处于重负载状态,那么这个线程池可能更容易被耗尽。原因是当您执行某些调用到数据库或外部API时,处理请求的线程会被阻塞,等待来自数据库或外部API的响应,这意味着它在此期间无法处理应用程序的其他请求。使用Spring Webflux则不会出现这种情况,因为线程不会阻塞等待。 - João Dias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接