Spring WebFlux中event loop工作原理及请求处理线程数疑问
响应式编程Event Loop线程相关问题解答
基础逻辑前置说明
你之前对Event Loop的认知基本准确:HTTP请求进入响应式应用后,会被拆解为IO就绪、报文读取、业务逻辑处理、响应写入等多个离散事件,每个事件绑定对应回调函数,由Event Loop按顺序调度执行,所有事件处理完成后结果返回给对应请求,全程没有阻塞等待的开销。
单个请求的处理会用到多少个线程
- 无阻塞的理想场景下,单个请求全程不会绑定固定线程,也不会同时占用多个线程。同一个请求的所有回调逻辑会依次在同一个Event Loop线程上执行,没有线程上下文切换的额外开销。
- 如果你代码中存在阻塞操作(比如同步数据库查询、
Thread.sleep调用),响应式框架会自动将这部分阻塞逻辑调度到独立的阻塞线程池执行,这种场景下单个请求会额外占用1个阻塞线程池的线程,阻塞逻辑执行完成后会切回Event Loop线程继续处理后续流程。
Event Loop中总共有多少个线程
不同的响应式 runtime 实现有差异,主流场景分为两类:
- 单Event Loop模型(典型如Node.js默认模式):总共有1个Event Loop调度线程,所有请求的非阻塞回调都在这一个线程上执行,仅会有少量底层辅助线程处理文件IO、DNS查询等系统操作,不属于Event Loop的调度线程池。
- 多Event Loop模型(典型如Netty、Spring WebFlux默认模式):Event Loop线程数默认和服务器CPU核心数相等,比如8核CPU默认启动8个Event Loop线程,每个线程独立处理自己的事件队列,互不干扰。你也可以通过框架配置手动调整线程数,高IO低计算的场景可以适当调大,计算密集型场景建议保持和CPU核心数一致即可。
注意:绝对不要在Event Loop线程上执行阻塞操作,一旦某个回调卡住了Event Loop线程,该线程上挂载的所有请求都会被阻塞,会直接导致应用吞吐量暴跌。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

