Spring Boot 应用能同时处理的请求数量取决于多个因素,包括底层 Servlet 容器的配置、硬件资源、应用逻辑复杂度以及代码设计模式。以下是详细分析:
1. Servlet 容器配置(以默认 Tomcat 为例)
Spring Boot 默认使用 Tomcat 作为 Servlet 容器,其核心配置参数如下:
参数 | 默认值 | 说明 |
---|---|---|
server.tomcat.threads.max | 200 | Tomcat 工作线程池的最大线程数(直接影响并发处理能力)。 |
server.tomcat.max-connections | 10000 | 最大连接数(包括正在处理和排队的连接)。 |
server.tomcat.accept-count | 100 | 等待队列长度(当所有线程忙碌且连接数达上限时,新请求进入队列,超限则拒绝)。 |
-
计算公式:
最大并发 ≈max-connections
+accept-count
但实际有效并发由threads.max
直接决定(每个请求需要一个线程处理)。 -
示例:
若max=200
、accept-count=100
,则:-
瞬时并发超过 200 时,后续 100 个请求进入队列。
-
超过 300 时直接拒绝(返回
Connection Refused
)。
-
2. 性能影响因素
(1) 同步阻塞模型(传统 Spring MVC)
-
线程池限制:每个请求占用一个线程直至完成。若线程池满(默认 200),后续请求排队或拒绝。
-
优化建议:
-
调整
server.tomcat.threads.max
(根据 CPU 核数和任务类型,如 IO 密集型可适当增大)。 -
使用连接池(如数据库连接池
HikariCP
)避免资源竞争。 -
缩短请求处理时间(如缓存、异步化部分逻辑)。
-
(2) 异步非阻塞模型(Spring WebFlux)
-
基于事件循环:无需为每个请求分配独立线程,适合高并发场景(如长连接、实时通信)。
-
理论性能:可支持数万并发,但依赖以下条件:
-
代码非阻塞(避免
Blocking IO
操作)。 -
外部依赖(如数据库、API)需支持异步驱动(如 Reactive MongoDB、WebClient)。
-
3. 硬件与系统限制
-
CPU:线程切换和计算密集型任务受 CPU 核数限制。
-
内存:每个请求占用内存(如堆内存、线程栈),需监控 JVM 内存使用。
-
操作系统:文件描述符限制(Linux 默认 1024,需调整
ulimit -n
)和 TCP 参数(如somaxconn
)。
4. 压测与优化建议
-
基准测试:使用工具(JMeter、Gatling)模拟不同并发场景,观察吞吐量和错误率。
-
关键指标:
-
QPS(每秒请求数):受限于线程数 × 单个请求处理速度。
-
响应时间:随并发增长可能陡增(需定位瓶颈)。
-
-
配置调整:
yaml
复制
server:tomcat:threads:max: 500 # 根据压测结果调整max-connections: 10000accept-count: 500
-
架构升级:
-
水平扩展(多实例 + 负载均衡)。
-
异步化(消息队列削峰填谷)。
-
静态资源分离(CDN 加速)。
-
5. 典型场景示例
场景 | 线程数 | QPS 估算 | 说明 |
---|---|---|---|
简单计算(10ms/请求) | 200 | 200 × (1000/10) = 20,000 | CPU 密集型,线程数不宜过高。 |
数据库查询(100ms/请求) | 200 | 200 × (1000/100) = 2,000 | 受限于数据库连接池和 IO 延迟。 |
WebFlux(非阻塞) | 少量 EventLoop 线程 | 10,000+ | 依赖外部服务响应速度和代码非阻塞设计。 |
结论
Spring Boot 的并发能力并非固定值,需结合线程池配置、代码设计、硬件资源综合评估。通过合理优化和压测,传统同步模型可支持数千并发,而异步模型(WebFlux)可达数万甚至更高。