首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
harrycoding
青岛科技大学 Java
发布于河北
关注
已关注
取消关注
学到了
@已删除:
SpringBoot可以同时处理多少请求?
前言前两天面试的时候,面试官问我:一个ip发请求过来,是一个ip对应一个线程吗?我突然愣住了,对于SpringBoot如何处理请求好像从来没仔细思考过,所以面试结束后就仔细研究了一番,现在就来探讨一下这个问题。正文我们都知道,SpringBoot默认的内嵌容器是Tomcat,也就是我们的程序实际上是运行在Tomcat里的。所以与其说SpringBoot可以处理多少请求,到不如说Tomcat可以处理多少请求。关于Tomcat的默认配置,都在spring-configuration-metadata.json文件中,对应的配置类则是org.springframework.boot.autoconfigure.web.ServerProperties。和处理请求数量相关的参数有四个: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。举个例子说明一下这几个参数之间的关系:如果把Tomcat比作一家饭店的话,那么一个请求其实就相当于一位客人。min-spare就是厨师(长期工);max是厨师总数(长期工+临时工);max-connections就是饭店里的座位数量;accept-count是门口小板凳的数量。来的客人优先坐到饭店里面,然后厨师开始忙活,如果长期工可以干的完,就让长期工干,如果长期工干不完,就再让临时工干。图中画的厨师一共15人,饭店里有30个座位,也就是说,如果现在来了20个客人,那么就会有5个人先在饭店里等着。如果现在来了35个人,饭店里坐不下,就会让5个人先到门口坐一下。如果来了50个人,那么饭店座位+门口小板凳一共40个,所以就会有10人离开。也就是说,SpringBoot同时所能处理的最大请求数量是max-connections+accept-count,超过该数量的请求直接就会被丢掉。纸上得来终觉浅,绝知此事要躬行。上面只是理论结果,现在通过一个实际的小例子来演示一下到底是不是这样:创建一个SpringBoot的项目,在application.yml里配置一下这几个参数,因为默认的数量太大,不好测试,所以配小一点: server: tomcat: threads: # 最少线程数 min-spare: 10 # 最多线程数 max: 15 # 最大连接数 max-connections: 30 # 最大等待数 accept-count: 10再来写一个简单的接口: @GetMapping("/test") public Response test1(HttpServletRequest request) throws Exception { log.info("ip:{},线程:{}", request.getRemoteAddr(), Thread.currentThread().getName()); Thread.sleep(500); return Response.buildSuccess(); }代码很简单,只是打印了一下线程名,然后休眠0.5秒,这样肯定会导致部分请求处理一次性处理不了而进入到等待队列。然后我用Apifox创建了一个测试用例,去模拟100个请求:观察一下测试结果:从结果中可以看出,由于设置的 max-connections+accept-count 的和是40,所以有60个请求会被丢弃,这和我们的预期是相符的。由于最大线程是15,也就是有25个请求会先等待,等前15个处理完了再处理15个,最后在处理10个,也就是将40个请求分成了15,15,10这样三批进行处理。再从控制台的打印日志可以看到,线程的最大编号是15,这也印证了前面的想法。总结一下:如果并发请求数量低于server.tomcat.threads.max,则会被立即处理,超过的部分会先进行等待,如果数量超过max-connections与accept-count之和,则多余的部分则会被直接丢弃。延伸:并发问题是如何产生的到目前为止,就已经搞明白了SpringBoot可以同时处理多少请求的问题。但是在这里我还想基于上面的例子再延伸一下,就是为什么并发场景下会出现一些值和我们预期的不一样?设想有以下场景:厨师们用一个账本记录一共做了多少道菜,每个厨师做完菜都记录一下,每次记录都是将账本上的数字先抄到草稿纸上,计算x+1等于多少,然后将计算的结果写回到账本上。Spring容器中的Bean默认是单例的,也就是说,处理请求的Controller、Service实例就只有一份。在并发场景下,将cookSum定义为全局变量,是所有线程共享的,当一个线程读到了cookSum=20,然后计算,写回前另一个线程也读到是20,两个线程都加1后写回,最终cookSum就变成了21,但是实际上应该是22,因为加了两次。 private int cookSum = 0; @GetMapping("/test") public Response test1(HttpServletRequest request) throws Exception { // 做菜。。。。。。 cookSum += 1; log.info("做了{}道菜", cookSum); Thread.sleep(500); return Response.buildSuccess(); }如果要避免这样的情况发生,就涉及到加锁的问题了,就不在这里讨论了。
点赞 84
评论 8
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
03-29 00:21
江南大学 算法工程师
AI 真能替代人类吗
xdm,我今天突然乐观了。 前两天一哥们私聊我,问要不要加入他的初创团队,做兼职。哥们对自己的项目非常的自信。大意是他做产品,负责调研市场,出方案,我干其中一部分活,做完项目之后挂平台卖,按成交量分成。画了一张非常大的饼:现在有完善的方案,我们只需要每天3-5小时,大概5天就做成一个项目,卖出一单后分成至少1w。 算日薪很高,对不对? 在我看到他的方案之前一切都正常。方案是邮件发给我的,字数还挺多,分工和步骤都挺明确的——好了,这就是全部的优点了。 他熬夜写出来的这个方案的可行性几乎为0。他想要训练一个模型,但市面上根本没数据,他的星期项目团队也当然是没有实验室来获取数据;他想验证模型鲁棒性,...
AI求职实录
点赞
评论
收藏
分享
04-01 20:48
蚌埠坦克学院 嵌入式软件开发
我觉得大三暑假实习比较合适一点
我认为大三暑假去实习是一个比较合适的时间点。一方面,这个阶段已经具备了一定的专业基础,比如编程能力、数据结构与基础算法、以及一些项目经验。相比大一大二,大三的知识结构更完整,能够更快适应企业的开发节奏,也更容易在实际项目中发挥作用。另一方面,大三暑假实习时间充足,可以完整参与一个项目的开发流程,从需求分析到代码实现,再到测试和上线,这种经历对理解工程化开发非常关键。同时,实习过程中还能了解企业的技术栈和开发规范,为后续找正式工作打下基础。更重要的是,大三实习可以作为一次“试错机会”。通过实际工作,可以判断自己是否适合某个技术方向或岗位,及时调整学习路线,而不是等到毕业后再去探索。因此,大三暑假...
你觉得大几开始实习最合适...
点赞
评论
收藏
分享
04-03 10:26
中国矿业大学 Java
字节hr面
hr先为昨天的delay道歉了,态度很温柔也很专业。主要问一些压力的克服实习内容与成长,困难怎么克服到岗时间与实习时长为什么不考研先打了个mentor和leader比较忙的预防针反问:工作节奏,offer时间
查看4道真题和解析
点赞
评论
收藏
分享
04-02 15:11
拉卡拉_研发中心_大模型应用算法(实习员工)
26暑期腾讯AI应用
项目介绍深挖基础知识进程,线程,协程是什么,区别在哪?如果两个线程同时读写一个资源该怎么做?(加锁)用户输入网址到返回网页的内部过程是怎么样的?TCP和UDP的区别是什么,分别适用于什么样的场景?为什么会出现QUIC协议,它是基于TCP还是UDP,解决什么样的问题?为什么HTTP/3要用QUIC,而不用TCP(想讲HTTP用TCP的问题所在,但是忘了)手撕DAG上的最长路径。(示例都错了,害我看半天,撕一半下意识摁ide补全键结果出问题了不能再写了,然后就算了讲思路,大概就是拓扑排序+DP)
查看8道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
春招面了四十多场,焚绝在此
2.7W
2
...
AIcoding上线了!你确定不来刷刷?
1.8W
3
...
双非春秋招3月总结与收获
4511
4
...
4.2字节后端一面
4184
5
...
美团暑期二面,横向挂
3510
6
...
恒生电子笔试已燃尽
3423
7
...
面试连挂3家后,我终于学会了"不会"的正确说法
2846
8
...
26年最值得冲的产品项目是什么?一个过来人的大实话
2601
9
...
恒生电子笔试
2518
10
...
2026 产品岗春招|这种「稀缺管培生」该怎么准备?
2415
创作者周榜
更多
正在热议
更多
#
面试被问到不会的问题,你怎么应对?
#
21240次浏览
523人参与
#
学历VS实习,哪个更重要?
#
857次浏览
31人参与
#
厦门银行科技岗值不值得投
#
15264次浏览
352人参与
#
你见过哪些招聘隐形歧视?
#
21804次浏览
186人参与
#
设计人的面试记录
#
205010次浏览
1630人参与
#
你觉得大几开始实习最合适?
#
24655次浏览
245人参与
#
招商银行数字金融训练营
#
106159次浏览
916人参与
#
uu们,春招你还来吗?
#
59812次浏览
641人参与
#
面试中,你被问过哪些奇葩问题?
#
94674次浏览
1179人参与
#
哔哩哔哩笔试
#
34709次浏览
140人参与
#
影石Insta360求职进展汇总
#
183991次浏览
1377人参与
#
国企/银行/研究所公司爆料
#
203383次浏览
913人参与
#
你都用vibe coding做过什么?
#
18248次浏览
725人参与
#
供应链/物流校招攻略
#
12400次浏览
218人参与
#
虹软科技求职进展汇总
#
16623次浏览
138人参与
#
AI Coding实战技巧
#
13042次浏览
276人参与
#
机械人还在等华为开奖吗?
#
325197次浏览
1599人参与
#
做完笔试后你收到面试了吗?
#
23966次浏览
210人参与
#
恒生电子笔试
#
19949次浏览
156人参与
#
你现在一天AI几次?
#
11102次浏览
118人参与
#
Vibe Coding 会干掉初级岗位吗?
#
19994次浏览
211人参与
#
如果人生可以debug你会改哪一行?
#
9724次浏览
140人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务