P19 SpringBoot 可以同时处理多少请求
面试题:一个 SpringBoot 应用最多能同时处理多少请求?
标准答案框架
没有固定数字,取决于部署容器(Tomcat)的线程池配置 + 硬件资源 + 业务耗时。
1. 默认容器:内嵌 Tomcat
SpringBoot 默认用内嵌 Tomcat,核心参数:
yaml
server:
tomcat:
threads:
max: 200 # 最大工作线程数(默认 200)
min-spare: 10 # 最小空闲线程
accept-count: 100 # 等待队列长度(默认 100)
max-connections: 8192 # 最大连接数(默认 8192)同时处理的请求数 ≈ 工作线程数上限(200),超出后请求进入 accept 队列(100),再超出的连接被拒绝/等待。
注意:Tomcat 的 BIO/NIO 里,连接数可以大于线程数,请求先接入再排队,但真正同时执行的受线程数限制。
2. 怎么算"能处理多少"
关键公式(小流量估算):
text
吞吐量 ≈ 工作线程数 / 平均单请求耗时例:200 线程,单请求 50ms,则每秒约处理 200 / 0.05 = 4000 个请求。
3. 优化方向
- 调大线程数:配合硬件(CPU 核数)设置,IO 密集可调大,CPU 密集不宜超过核数太多;
- 缩短单请求耗时:加缓存、异步化、并行调用;
- 异步处理:
@Async、CompletableFuture、Servlet 异步(DeferredResult),把请求线程释放出来; - 微服务拆分/集群:水平扩容多实例,前面挂 Nginx/网关负载均衡;
- 限流与降级:防止请求洪峰把 Tomcat 线程池打满(线程池满后新请求直接排队或拒绝)。
4. 面试加分点
- 强调"同时处理"和"每秒处理"(吞吐)是两个概念;
- 线程池满时的表现:队列满 → 拒绝策略(默认抛异常/丢请求),所以要配好 accept-count;
- 长连接/WebSocket 场景要关注
max-connections,不是线程数; - 生产通过压测得到真实容量,再设置限流阈值。
一句话总结
SpringBoot 同时处理请求数主要由内嵌 Tomcat 的 max-threads(默认 200)+ accept 队列决定;实际吞吐 = 线程数 ÷ 单请求耗时,优化靠调参、异步化、缓存和水平扩容,容量靠压测验证。