首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧WebFlux与反应器的线程化模型

弹簧WebFlux与反应器的线程化模型
EN

Stack Overflow用户
提问于 2017-07-10 18:41:48
回答 1查看 32.1K关注 0票数 54

目前正在用Spring5.0.0.RC2反应器3.1.0.M2SpringBoot2.0.0.M2进行反应编程试验。

想知道并发和线程模型,被WebFlux和反应器用来正确编码应用程序和处理可变状态。

反应堆文档指出,这个库被认为是与并发无关的,并提到了Scheduler抽象。WebFlux文档不提供信息。

然而,当通过Spring使用WebFlux时,就定义了一个线程模型。

从我的实验来看我得到的是:

  • 模型既不是一个事件线程,也不是一个事件线程+工作人员。
  • 使用多个线程池。
  • “反应堆- HTTP -nio-3”线程:可能每个核心一个线程,处理传入的HTTP请求
  • "Thread-7“线程:用于对MongoDB或HTTP资源的异步请求
  • “并行-1”线程:每个核心一个线程,由反应堆Schedulers.parallel()创建,由延迟操作符等使用。
  • 应用程序必须同步共享可变状态。
  • ThreadLocal (用于应用程序状态、MDC日志记录等)没有请求作用域,因此不是很有趣。

这是对的吗?WebFlux的并发和线程模型是什么:例如,默认线程池是什么?

谢谢你提供这信息

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 10:29:52

在这个问题之后,目前的文档确实提供了一些关于并发模型的线索。和人们可以期待的线程(但我仍然认为,从多线程的角度来更清楚地描述场景下发生的事情,将会受到Spring新手的高度赞赏)。

它讨论了Spring和Spring (每个请求1线程模型与事件循环)之间的区别:

在Spring和servlet应用程序中,一般假定应用程序可以阻塞当前线程,例如用于远程调用,因此servlet容器在处理请求时使用一个大型线程池来吸收潜在的阻塞。 在Spring WebFlux和一般的非阻塞服务器中,假定应用程序不会阻塞,因此非阻塞服务器使用一个小的、固定大小的线程池(事件循环工作人员)来处理请求。调用阻塞API

但是请注意,Spring应用程序也可以引入一些异步性(参见Servlet 3异步)。我建议使用这份报告来讨论WRTServlet3.1NIO和WebFlux。

回到docs:它还建议,在处理反应性流时,您可以进行一些控制:

如果您确实需要使用阻塞库,怎么办? 反应器和RxJava都提供了publishOn操作符,以便在不同的线程上继续处理。

(有关此问题的详细信息,请参阅反应堆调度)

它还讨论了在WebFlux应用程序中可能期望的线程(粗体是我的):

线程模型 您希望在运行的服务器上看到哪些线程?

  • 在“普通”Spring WebFlux服务器上(例如,没有数据访问,也没有其他可选的依赖项),您可以期望一个线程用于服务器,其他几个线程用于请求处理(通常是多到CPU核心的数量)。但是,servlet容器可以从更多的线程(例如Tomcat上的10个线程)开始,以支持Servlet、阻塞I/O和Servlet3.1、非阻塞I/O使用。
  • 反应性WebClient事件循环样式操作。因此,您将看到一个与此相关的小的、固定数量的处理线程,例如,与反应堆Netty连接器一起的“反应堆-http”。但是,如果将反应堆Netty用于客户机和服务器,则默认情况下两者将共享事件循环资源。
  • 反应器和RxJava提供线程池抽象,称为调度程序,用于与publishOn操作符一起使用,用于将处理切换到不同的线程池调度程序的名称表示特定的并发策略,例如,对于数量有限的线程,“并行”用于与CPU绑定的工作,或用于具有大量线程的I/O绑定工作的“弹性”。如果您看到这样的线程,这意味着一些代码正在使用特定的线程池调度器策略。
  • 数据访问库和其他第三方依赖项也可以创建和使用自己的线程。

在某种程度上,您可以通过配置配置来配置线程模型的详细信息。

要为服务器配置线程模型,您需要使用特定于服务器的配置API,或者如果使用Spring,则检查每个服务器的Spring配置选项。可以直接配置WebClient。对于所有其他库,请参考它们各自的文档。

此外,正如Spring 2.0中的默认线程数--反应性webflux配置所强调的那样,

请求处理的默认线程数由底层web服务器决定;默认情况下,SpringBoot2.0使用的是request,它使用Netty的默认值

这是一个默认组件及其默认值(以及总体配置,包括通过注释透明注入的配置)的问题--这也可能在Spring/Boot的不同版本和相应的依赖项之间发生变化。你的猜测似乎是对的。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45019486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档