目前正在尝试使用 Spring 5.0.0.RC2 , Reactor 3.1.0.M2 和 Spring Boot 2.0.0.M2 进行反应式编程 .
想知道WebFlux和Reactor用来正确编写应用程序并处理可变状态的 concurrency and threading model .
Reactor doc声明该库被认为是并发不可知的,并提到了Scheduler抽象 . WebFlux文档不提供信息 .
然而,当通过Spring Boot使用WebFlux时,定义了一个线程模型 .
从我的实验中得到的是:
-
该模型既不是1个事件线程,也不是1个事件线程工作者
-
使用了几个线程池
-
“reactor-http-nio-3”线程:可能每个核心一个,处理传入的HTTP请求
-
“Thread-7”线程:由对MongoDB或HTTP资源的异步请求使用
-
“parallel-1”线程:每个核心一个,由Reactor的Schedulers.parallel()创建,由延迟运算符等使用
-
共享可变状态必须由应用程序同步
-
ThreadLocal(用于应用程序状态,MDC日志记录等)不是请求作用域,因此不是很有趣
它是否正确 ?什么是WebFlux的并发和线程模型:例如,什么是默认线程池?
感谢您的信息
1 回答
在问题之后,present documentation does provide some clues about the concurrency model和人们可以预期的线程(但我仍然认为从多线程角度更清楚/更好地描述场景中发生的事情将受到Spring新人的高度赞赏) .
它讨论了Spring MVC和Spring WebFlux之间的区别(每个请求1个线程的模型与事件循环):
但请注意,Spring MVC应用程序还可以引入一些异步性(参见Servlet 3 Async) . 我建议this presentation讨论Servlet 3.1 NIO和WebFlux .
回到文档:它还表明,在使用反应流时,您可以控制:
(有关详细信息,请参阅scheduling in Reactor)
它还讨论了WebFlux应用程序中您可能期望的线程( bold 是我的):
在某种程度上,您可以通过配置配置线程模型的详细信息
而且,例如,讨论Default number of threads in Spring boot 2.0 reactive webflux configuration强调,
它是默认组件及其默认值(以及整体配置,包括通过注释透明注入的)的问题 - 它们也可能在Spring / Boot版本和相应的依赖项之间发生变化 . 说,你的猜测似乎是正确的 .