SpringBoot 可以同时处理多少请求

目录

一、前言

二、相关配置

1、配置信息

2、配置说明

3、案例说明

三、代码验证

1、测试代码

2、测试步骤

四、总结


一、前言

首先,在Spring Boot应用中,我们可以使用 Tomcat、Jetty、Undertow 等嵌入式 Web 服务器作为应用程序的运行容器。这些服务器都支持并发请求处理的能力。另外,Spring Boot 还提供了一些配置参数,可以对 Web 服务器进行调优,以提高其并发处理能力。而我们大家都知道,Spring Boot应用默认使用的Web服务器(内嵌容器)为Tomcat,了解了以上内容,我们就知道,这个问题的本质就是一个Spring Boot应用,内嵌的Tomcat能够处理多少请求

二、相关配置

1、配置信息

关于Tomcat的默认配置,都在spring-configuration-metadata.json文件中,对应的配置类则是org.springframework.boot.autoconfigure.web.ServerProperties。

2、配置说明

server.tomcat.threads.min-spare :最少的工作线程数,默认大小是10。该参数相当于长期工,如果并发请求的数量达不到10,就会依次使用这几个线程去处理请求。
server.tomcat.threads.max :最多的工作线程数,默认大小是200。该参数相当于临时工,如果并发请求的数量在10到200之间,就会使用这些临时工线程进行处理。
server.tomcat.max-connections :最大连接数,默认大小是8192。表示Tomcat可以处理的最大请求数量,超过8192的请求就会被放入到等待队列。
server.tomcat.accept-count:等待队列的长度,默认大小是100。

3、案例说明

如果把Tomcat比作一家饭店的话,那么一个请求其实就相当于一位客人。min-spare 就是厨师(长期工);max是厨师总数(长期工+临时工);max-connections 就是饭店里的座位数量;accept-count是门口小板凳的数量。来的客人优先坐到饭店里面,然后厨师开始忙活,如果长期工可以干得完,就让长期工干,如果长期工干不完,就再让临时工干。

图中画的厨师一共15人,饭店里有30个座位,也就是说,如果现在来了20个客人,那么就会有5个人先在饭店里等着。如果现在来了35个人,饭店里坐不下,就会让5个人先到门口坐一下。如果来了50个人,那么饭店座位+门口小板凳一共40个,所以就会有10人离开。

也就是说,SpringBoot能同时处理的最大请求数量是max-connections + accept-count,超过该数量的请求直接就会被丢掉。

三、代码验证

1、测试代码

首先创建一个SpringBoot的项目,然后在application.yml里配置一下对应参数,默认最大连接数为8192,这里我们为了方便你测试,将最大连接数调整为40。

配置内容:

复制代码
server:
  tomcat:
    threads:
      # 最少线程数
      min-spare: 10
      # 最多线程数
      max: 15
    # 最大连接数
    max-connections: 30
    # 最大等待数
    accept-count: 10

接口内容:

首先通过日志输出线程名称,然后休眠0.5秒,这样就会使得应用在处理请求时,无法一次性处理所有请求,从而让部分请求进入到等待队列。

java 复制代码
@GetMapping("/test")
public Response test1(HttpServletRequest request) throws Exception {
    log.info("ip:{},线程:{}", request.getRemoteAddr(), Thread.currentThread().getName());
    Thread.sleep(500);
    return Response.buildSuccess();
}

2、测试步骤

使用Apifox创建一个测试用例,来模拟100个请求,如果你不习惯使用这个工具的话,也可以使用jmeter来达到同样的测试效果。

从结果中可以看出,由于设置的max-connections + accept-count的和是40,所以有60个请求会被丢弃,这和我们的预期是相符的。由于最大线程是15,也就是有25个请求会先等待,等前15个处理完了再处理15个,最后在处理10个,也就是将40个请求分成了15,15,10这样三批进行处理。

再结合控制台打印的日志不难看出,线程的最大编号是15,这也印证了前面的想法。

四、总结

  • SpringBoot能同时处理的最大请求数量是max-connections + accept-count。
  • 如果并发请求数量低于server.tomcat.threads.max,则会被立即处理,超过的部分会先进行等待。
  • 如果数量超过max-connectionsaccept-count之和,则多余的部分则会被直接丢弃。
  • SpringBoot在处理请求时,会根据请求的数量,分批次进行处理。
相关推荐
TeDi TIVE41 分钟前
springboot和springframework版本依赖关系
java·spring boot·后端
雨辰AI41 分钟前
SpringBoot3 + 人大金仓 V9 微服务监控实战|Prometheus+Grafana+SkyWalking 全链路监控
数据库·后端·微服务·grafana·prometheus·skywalking
二哈赛车手42 分钟前
新人笔记---ES和kibana启动问题以及一些常用的linux的错误排查方法,以及ES,数据库泄密解决方案[超详细]
java·linux·数据库·spring boot·笔记·elasticsearch
Nicander1 小时前
理解 mybatis 源码:vibe-coding一个mini-mybatis
后端·mybatis
小呆呆6662 小时前
Codex 穷鬼大救星
前端·人工智能·后端
FelixBitSoul2 小时前
缓存淘汰策略全解:从原理到手写实现(Java / Go / Python)
后端·面试
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题】【Java基础篇】第29题:静态代理和动态代理的区别是什么
java·开发语言·后端·面试·代理模式
小编码上说3 小时前
LSH(局部敏感哈希)分桶,海量数据下的相似性搜索解决方案
java·spring boot·缓存·langchain4j·lsh·局部敏感哈希·ai调用优化
计算机_毕业设计3 小时前
java-springboot数字藏品系统 基于 SpringBoot 的区块链数字艺术品交易平台 Java 微服务架构下的加密藏品展示与拍卖系统计算机毕业设计
java·spring boot·课程设计
dovens4 小时前
SpringBoot集成MQTT客户端
java·spring boot·后端