SpringBoot项目高并发问题
在SpringBoot
项目中通常我们没有处理并发问题,但是使用项目本身还是支持一定的并发量,因为在SpringBoot
中内嵌Tomcat
容器,而Tomcat
在spring-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 记录
SpringBoot项目高并发问题相关推荐
- springboot实现高并发红包系统(java 全网最全包括语音口令 文字口令 普通 拼手气)
博主技术笔记 博主开源微服架构前后端分离技术博客项目源码地址,欢迎各位star springboot实现高并发红包系统(全网最全) 下面的业务处理请根据你们实际的场景进行处理 1.sql设计 CREA ...
- [SpringBoot][15][SpringBoot处理高并发]
第 15 章 SpringBoot处理高并发 在企业实际应用中,会遇到很多高并发场景,最典型的例子就是双十一的抢购.这时候,如果仅仅按照之前简单的方式进行处理,不仅性能无法保证,而且有可能导致数据库某 ...
- api商品分享源码_SSM框架高并发和商品秒杀项目高并发秒杀API源码免费分享
前言: 一个整合SSM框架的高并发和商品秒杀项目,学习目前较流行的Java框架组合实现高并发秒杀API 源码获取:关注头条号转发文章之后私信[秒杀]查看源码获取方式! 项目的来源 项目的来源于国内IT ...
- 项目高并发问题解决方案合集
Java项目中高并发问题的解决方案 这道题是比较典型的题吧,也是我第一个公司入职的时候,面试官问我的,当时我回答只能说是星星之火,还不能燎原那种,差点被面试官给浇灭. 1.采用缓存技术 这是最简单的一 ...
- 高并发服务器开源项目,高并发服务器框架详解 - osc_qgfjs4a5的个人空间 - OSCHINA - 中文开源技术交流社区...
1)如何设计如何扩展 2)什么是高并发 (1)任务:完成某个功能的一个一个目标任务,服务器程序也是不例外的. (2)CPU核心:完成具体任务的,是CPU核心 + 周围的外设(读写磁盘IO.网络IO) ...
- 基于SpringBoot的高并发秒杀(限时秒杀)
序 最近出于公司业务需要,做了拼团抢购,秒杀的业务. 秒杀系统场景特点 秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增. 秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成 ...
- web项目高并发量网站解决方案
一个小型的网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构.性能的要求都很简单.随着互联网业务的不断丰富,网站相关的技术经过 ...
- Java高并发秒杀平台(Redis + RabbitMQ)
Seconds-Kill 本项目是一个模拟高并发环境下基于 SpringBoot 的秒杀购物平台.为了减少对数据库的直接访问,通过 Redis 实现了缓存优化:并通过 RabbitMQ 消息中间件来接 ...
- 电商网站秒杀和抢购的高并发技术实现和优化
一.如何防止多个用户同时抢购同一商品,防止高并发同时订购同一商品? 最近双十一抢购系统应用频繁,销量火爆的同时,让人头疼是却是多用户高并发情况下出现的库存问题. 据调查,多个用户同时下单,导致查询和 ...
最新文章
- golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...
- SPI flash配置
- 【高并发、高性能、高可用】系统设计经验分享!
- 【活动报名 | 青源Talk第一期】喻纯 | 自然人机交互的进展与挑战
- git简介及使用方法
- JBPM executionService.deleteProcessInstanceCascade(id)报错
- @param注解_启用 parameters 编译选项简化 mybatis @Param 注解重复问题
- 什么是REST API?
- 管道popen和pclose的实例使用
- docker学习5--docker数据卷(volume)
- 辉迅手机号码归属地查询软件 手机号码归属地 手机查询
- matlab化函数图像示例,Matlab绘制函数图像函数示例汇总
- 多媒体计算机辅助英语教学,浅谈多媒体计算机辅助英语教学
- 分库分表学习总结(1)——数据库中间件MyCat学习总结之MyCat入门简介
- Oracle中国区管理层变更史
- 思科 mds 虚拟服务器,保护、扩展、简化,思科MDS9000系列交换机,刷新存储网络新标准!...
- docker文件编辑
- C语言中的strcat()函数
- ch01_时间序列分析简介
- 我们应该有一个属于我们自己的游戏 我是一只单飞的鸟