SpringBoot项目中通常我们没有处理并发问题,但是使用项目本身还是支持一定的并发量,因为在SpringBoot中内嵌Tomcat容器,而Tomcatspring-configuration-metadata.json文件中设置了关于并发的默认配置:
在这里插入图片描述

{
  "name": "server.tomcat.max-connections",
  "description": "“服务器在任何给定时间接受和处理的最大连接数。",
  "defaultValue": 8192
},
{
  "name": "server.tomcat.accept-count",
  "description": "当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。",
  "defaultValue": 100
},
{
  "name": "server.tomcat.max-http-form-post-size",
  "description": "http使用Post请求时候的表达最大容量。",
  "defaultValue": "2MB"
},
{
  "name": "server.tomcat.max-keep-alive-requests",
  "description": "在连接关闭之前可以管道化的最大HTTP请求数。",
  "defaultValue": 100
},
{
  "name": "server.tomcat.threads.max",
  "description": "工作线程的最大数量。",
  "defaultValue": 200
},
{
  "name": "server.tomcat.threads.min-spare",
  "description": "工作线程的最小数量。",
  "defaultValue": 10
},
{
  "name": "server.servlet.session.timeout",
  "description": "会话超时。如果未指定持续时间后缀,将使用秒。",
  "defaultValue": "30m"  // 这里m表示分钟,s表示秒
},

在默认配置下:
在默认情况下当连接数超过8192时,就会出现拒绝连接。
最小线程数量为10,最大线程数量为200,等待队列长度设置为acceptCount=100,当可分配的线程数全部用完之后,后续的请求将进入等待队列等待,等待队列满后则拒绝处理。

而这些默认配置可以在配置文件中进行修改,比如:

## 服务器最大连接数,默认8192
server.tomcat.max-connections=10000
## 等待队列长度,默认100。
server.tomcat.accept-count=1000
## 最大工作线程数,默认200。(4核8g内存,线程数经验值800。)
server.tomcat.threads.max=800
## 最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量)
server.tomcat.threads.min-spare=100

可以用Jmeter测试工具来测试下配置前后的并发量的性能,比如我这里先使用默认配置:
在这里插入图片描述
Jmeter怎么使用可以查看博客:Jmeter教程(一) - 入门

配置服务器,然后重启后,在运行以下Jmeter压力测试工具:
在这里插入图片描述
其中:

Label:取样器名称(或者是事务名)。
#Samples:取样器运行次数(提交了多少笔业务)。
Average:请求(事务)的平均响应时间,单位为毫秒。
Min:请求的最小响应时间,单位为毫秒。
Max:请求的最大响应时间,单位为毫秒。
Std.Dev:响应时间的标准方差。
Error%:事务错误率。

在第二次中,提交次数为第一次的3倍:

  • 平均响应时间小于3倍,大约为2倍,也就是说直观上来说加快了效率;
  • 请求的最小响应时间变得更小了,请求的最大响应时间这里却增大了,所以可能设置的配置值不合理。
  • 总的来说就是确实在略微变大服务器的并发配置的时候,效率上有一些提升。

我们知道在Http1.1之后就默认支持TCP长连接,已达到连接复用,提高资源复用率和请求效率。而我们通常在请求的时候适用的请求头部字段为Connection:keep-alive。如果说用户在一次请求后,并没有其余的操作了,而使用长连接来保持这个请求,很明显这里就会导致资源的浪费问题。

那么,我们可以在后台设置其超时时长,可以从两个方面设置:

  • session超时,我们知道默认的session超时为30分钟,所以我们可以设置一个较短的时间来达到断开连接的目的;可以在用户登录成功后,就设置一个Session的超时时长,比如:session.setMaxInactiveInterval(6 * 60); // 默认单位为秒,这里为6分钟。
  • keep-alive超时,每个连接可以设置其超时时长,可以参考博客:springboot 长连接 keepalive 记录
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐