Spring Web MVC 与 Spring WebFlux。阻塞和非阻塞

Ras*_*iev 7 java spring spring-mvc

我是 Spring 新手,正在读一本书“Pro Spring boot 2”。这里说Spring Web MVC对每个请求都有一些阻塞,而Spring Webflux是一个完全非阻塞的堆栈。

  1. 请告诉我,这是什么意思?
  2. 到达 Spring MVC 的请求会激活一个线程来执行该请求。何时以及为何被阻止?
  3. 为什么 Spring WebFlux 不阻塞线程?

Joã*_*ias 11

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

  • 是的,有一个线程池。这就是为什么即使您使用 Spring MVC,您的应用程序也能够响应多个请求。Spring MVC 的问题是,如果您的应用程序负载较重,该线程池可能更容易耗尽。原因是,当您对数据库或外部 API 进行一些调用时,处理请求的线程会被阻塞,等待数据库或外部 API 的答复,这意味着它无法处理对应用程序的其他请求同时。使用 Spring Webflux 不会发生这种情况,因为线程不会阻塞等待 (3认同)