Skip to content

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 队列决定;实际吞吐 = 线程数 ÷ 单请求耗时,优化靠调参、异步化、缓存和水平扩容,容量靠压测验证。

基于 VitePress 重建