SpringBoot WebFlux流式端点并发连接数受限的原因及扩容方法
问题原因及解决方案
问题原因
这个问题的核心是Netty事件循环线程池被长连接占满。
Spring Boot WebFlux默认使用Netty作为底层服务器,默认的Netty Worker线程数为CPU核心数 × 2(比如4核CPU对应8个Worker线程),加上1个Boss线程,总共9个线程。你的流式端点会创建长连接,每个连接的持续数据推送操作默认在Netty事件循环线程上执行,当9个连接耗尽所有事件循环线程后,新的请求(包括流式连接和简单的Hello World请求)就没有线程可以处理,导致无响应。关闭一个连接后,线程被释放,新请求才能得到处理。
解决方法
1. 增加Netty Worker线程数
通过配置文件调整Worker线程数,根据服务器CPU核心数和预期连接数设置合适的值:
# application.properties server.netty.worker-count=16
# application.yml server: netty: worker-count: 16
该配置直接扩充Netty事件循环线程池大小,能容纳更多长连接。
2. 将流式任务切换到独立线程池
避免长连接占用Netty事件循环线程,把Flux的定时推送逻辑切换到独立调度器执行,让Netty线程仅负责IO操作:
修改流式端点代码:
import reactor.core.scheduler.Schedulers @GetMapping("/stream") fun stream(): Flux<String> { return Flux.interval(Duration.ofSeconds(1)) .map { a: Long -> "returning $a" } .publishOn(Schedulers.boundedElastic()) // 切换到弹性线程池执行推送逻辑 }
Schedulers.boundedElastic()适合处理长时间运行的任务,会根据需求动态创建线程,同时限制最大线程数避免资源耗尽。你也可以自定义线程池实现更精细的资源控制。
3. 检查并调整Netty最大连接数(可选)
默认情况下Netty的最大连接数为无限制(server.netty.max-connections=-1),如果环境有特殊配置,可按需调整:
# application.properties server.netty.max-connections=100
该配置设置服务器能接受的最大连接数,根据业务需求调整即可。
内容的提问来源于stack exchange,提问作者not_john
相关产品推荐
相关产品推荐

