阿里二面:SpringBoot同时可以处理多少个请求?直接懵了。。。

SpringBoot以其简洁高效的开发方式和强大的内嵌容器特性,为开发者提供了构建高性能后端服务的便利。然而,当面临高并发场景时,理解并合理配置Spring Boot应用以达到最佳的并发处理能力至关重要。在Spring Boot中,应用程序对HTTP请求的并发处理主要依赖于内嵌的Servlet容器(如Tomcat)。接下来我们以Tomcat为例谈谈这个问题。

本文以SpringBoot2.7.0为例。

在接下来讲解Tomcat工作线程池之前,你可以先了解一下Java线程池的工作原理,请参考这篇文章:Java线程池最全详解

请求处理

我们的程序实际上是运行在Tomcat里的。所以SpringBoot可以处理多少请求,其实也就是看Tomcat可以处理多少请求。Tomcat的工作线程池负责接收并处理这些请求。在SpringBoot中关于Tomcat工作项城池的参数可以在spring-boot-autoconfigure的依赖包中的spring-configuration-metadata.json中有如下四个参数控制Tomcat的工作线程池:

{{  "name": "server.tomcat.threads.max",  "type": "java.lang.Integer",  "description": "Maximum amount of worker threads.",  "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat$Threads",  "defaultValue": 200  },  {  "name": "server.tomcat.threads.min-spare",  "type": "java.lang.Integer",  "description": "Minimum amount of worker threads.",  "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat$Threads",  "defaultValue": 10  },{  "name": "server.tomcat.max-connections",  "type": "java.lang.Integer",  "description": "Maximum number of connections that the server accepts and processes at any given time. Once the limit has been reached, the operating system may still accept connections based on the \"acceptCount\" property.",  "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",  "defaultValue": 8192  },{  "name": "server.tomcat.accept-count",  "type": "java.lang.Integer",  "description": "Maximum queue length for incoming connection requests when all possible request processing threads are in use.",  "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties$Tomcat",  "defaultValue": 100  }
}

我们来看一下这四个参数的含义:

  • server.tomcat.threads.max:用于配置Tomcat内嵌服务器的工作线程池的最大工作线程数。工作线程用于处理接收到的HTTP请求,处理完毕后将返回到线程池中等待下一个请求。当并发请求数量小于等于 threads.max 时,Tomcat尽可能使用现有的工作线程来处理请求,如果并发请求数量超过了 threads.maxTomcat不再创建新的工作线程,而是将请求放入队列等待。该值可以看做是一个临时工,如果并发请求的数量在threads.min-sparethreads.max之间,就会使用这些临时工线程进行处理。默认值为200。主要关注的是工作线程池,用于处理请求的线程数。适用于调整并发请求的处理能力。

  • server.tomcat.threads.min-spare:确定了工作线程池的最小空闲线程数量,即使没有请求需要处理,也会保持这些线程处于等待状态,以便快速响应新的请求。该值可以看做是一个长期工,如果并发请求数小于min-spare,就会使用这些线程去处理请求。默认值是10,即使没有活跃的请求,Tomcat也会保持至少 10 个空闲线程。

  • server.tomcat.max-connections:用于配置Tomcat内嵌服务器的连接池的最大连接数。即允许同时存在的最大连接数。这个连接数是针对整个连接池的,不仅仅是工作线程的数量。当并发请求数量导致服务器需要创建新的连接时,Tomcat 会检查连接池中的连接数是否已经达到了 max-connections 配置的最大值。如果已经达到最大值,新的连接请求将被放入等待队列中,直到有连接被释放。默认值8192。

  • server.tomcat.accept-count:用于配置Tomcat连接器所允许的最大等待接受连接的请求数(即等待队列)。当所有线程都在处理其他请求时,新的连接请求将会排队等待。如果队列已满,额外的连接将被拒绝。默认值是100。

我们以饭馆的示例去说明这几个参数之间的关系:
我们把Tomcat比作一家热门的餐厅,每个顾客都是一个请求。餐厅里一直有一部分厨师一直待命,无论有没有顾客,确保随时能够处理点单。这部分厨师就是min-spare(长期工),当餐厅遇到一些大的宴会时,餐厅老板就会从外面找过来一批厨师帮忙,这部分厨师就是临时工,临时工+长期工就是(max)。餐厅的座位就表示同时最大可以容纳啊就餐的顾客人数,即max-connections。假如某时餐厅生意火爆,餐厅的座位都坐满以后,此时餐厅就会想办法在餐厅门口放上一排座椅,可以让后来的顾客在这里等待,假如里面有顾客吃完,这时外面等待的顾客就可以进去用餐。如果餐厅门口的座椅也做满,再来的顾客就会离开。

假如上述就是那家餐厅,2个绿色框代表长期工厨师即min-spare,3个红色框代表临时工厨师,共有5名厨师,即max数量,5个棕色的队列即餐厅椅子数量,即5个max-connections,餐厅最多可以容忍5名顾客吃饭,2个橘色队列代表门口等待区椅子数量,即2个accept-count。假如此时来了4个客人,那就可以区餐厅吃饭,如果来了7个客人,那么有5个客人进去吃饭,2个客人在门口等待,如果来了8个客人,那么有5个客人进去吃饭,2个客人在门口等待,剩下1个客人就会直接离开。

示例

我们创建一个SpringBoot项目,我们将上述四个参数分别修改为如下:

server.tomcat.accept-count=2  
server.tomcat.max-connections=5  
server.tomcat.threads.max=5  
server.tomcat.threads.min-spare=2

然后我们在定义一个接口,用于模拟客户端请求:

@RestController  
@RequestMapping("test")  
public class TestMaxRequestController {  @GetMapping("maxRequest")  @ResponseBody  public String testMaxRequest() throws InterruptedException {  System.out.println("当前请求线程: "+Thread.currentThread().getName());  Thread.sleep(2000);  return "Hello World";  }  
}

我们启动项目,使用JVisualVM监测一下此时项目中的线程数为2个:

image.png

此时我们使用Apifox发起一个请求,观察线程数没有增长。我们在使用Apifox中模拟3个线程同时请求,发现此时线程数变成5个:
image.png

我们继续增加线程数到7个,我们发现线程数还是5个,因最大线程数等于5个:

image.png

后台请求全部成功:
image.png

我们继续增加线程数到8个,此时线城数依然是5个,设置请求超时时间为1秒,但是有一个请求失败:

image.png

image.png
image.png

服务端只处理了7个请求:
image.png

结论

SpringBoot可以同时处理多少个请求,需要看其内嵌的Sevlet处理线程的能力,以Tomcat为例,即Tomcat可以处理多少请求,这需要看配置文件中设置的server.tomcat.accept-count以及server.tomcat.max-connections的大小。Tomcat同时可以处理的请求为server.tomcat.accept-count加上 server.tomcat.max-connections。实际生产应用中我们需要根据服务器,硬件的配置等综合因素考虑后,调节这两个值,确保应用程序能够处理预期的并发量。

本文已收录于我的个人博客:码农Academy的博客,专注分享Java技术干货,包括Java基础、Spring Boot、Spring Cloud、Mysql、Redis、Elasticsearch、中间件、架构设计、面试题、程序员攻略等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439786.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录 Leetcode404.左叶子之和

题目&#xff1a; 代码(首刷看解析&#xff09;&#xff1a; class Solution { public:int sumOfLeftLeaves(TreeNode* root) {int res 0;if (root nullptr) return res;queue<TreeNode*> que;TreeNode* cur root;que.push(cur);int size 0;while (!que.empty()) {s…

Java中支持父类转子类,不支持子类转父类吗?

不&#xff0c;我的意思是正好相反。在 Java 中&#xff1a; 子类转父类&#xff08;向上转型&#xff09;&#xff1a;这是自动的且总是安全的。子类是父类的一个特化&#xff0c;因此子类的对象可以被视为是父类的一个实例。例如&#xff0c;如果 ExamineApproveNode 是 Base…

windows 远程桌面 复制粘贴 无效

目录 rdpclip.exe进程没有运行或运行异常。 解决办法&#xff1a; 1、在服务器上打开任务管理器&#xff0c;查看进程&#xff0c;找到 rdpclip.exe 进程&#xff0c; 关闭。 2、重新运行此程序 rdpclip.exe进程没有运行或运行异常。 rdpclip 是让rdp协议&#xff08;远程…

基于Redis的高可用分布式锁——RedLock

目录 RedLock简介 RedLock工作流程 获取锁 释放锁 RedLock简介 Redis作者提出来的高可用分布式锁由多个完全独立的Redis节点组成&#xff0c;注意是完全独立&#xff0c;而不是主从关系或者集群关系&#xff0c;并且一般是要求分开机器部署的利用分布式高可以系统中大多数存…

vikayun维格云洞察:问答即洞察

在当今这个信息爆炸的时代,数据分析已经成为了企业和个人决策的重要依据。然而,面对海量的数据,如何从中提取有价值的信息,成为了一个亟待解决的问题。幸运的是,人工智能技术的发展为我们提供了一种全新的解决方案——利用AI进行数据洞察。今天,我们就来聊聊这个话题,看…

python-分享篇-使用MD5或SHA1等算法对用户密码进行加密

文章目录 代码效果 代码 对用户密码进行MD5或者SHA加密import hashlib str input(请输入要加密的字符串&#xff1a;) #MD5加密&#xff08;返回32位16进制表示字符串&#xff09; md5hashlib.md5() md5.update(str.encode(utf-8)) print(MD5加密:,md5.hexdigest())#SHA1加密&…

StoryGPT-V——可以生成漫画故事的多模态大模型

前言 目前&#xff0c;大型模型在复杂故事可视化任务方面依然面临着重大挑战。这是因为此类任务需要对框架描述中的代词&#xff08;例如He、她、他们、他们&#xff09;进行解析&#xff0c;即在分辨率和确保跨帧的角色和背景融合方面进行详细解剖。尽管存在这些挑战&#xf…

谷歌人工智能视频生成器-LUMIERE(未开源)

Google重磅发布视频生成模型Lumiere 据说后续会开源 亮点1.支持文本到视频与图像到视频 亮点2.画风迁移 亮点3.运动蒙版 亮点4.视频编辑 亮点5.视频修复 谷歌视频模型可以生成80帧的片段&#xff01;不仅画质好、质量高&#xff0c;而且时长更长。 视频局部编辑 这项功能可以…

【旋转角度(CW/CCW)的累加计算】

1&#xff0c;需求 旋转角度&#xff08;CW/CCW&#xff09;的累加计算 2&#xff0c;代码实现 class AngleProcess:def __init__(self, is_cw, period360):self.is_cw is_cwself.period periodself.half_period period / 2self.init_angle_0_and_circle_num()def check_i…

麒麟系统—— openKylin 安装 redis

麒麟系统—— openKylin 安装 redis 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载安装文件三、解压安装解压安装 四、配置与运行修改配置文件以配置文件运行 五、加入到服务中最终&#xff1a;介绍配置的其他参数使用 Redis是一种开源的、基于内存的高速缓存…

python字典JSON 和csv文件

JSON与Python字典 Python中的字典与JSON非常类似而且支持嵌套结构。Json通过key取值的过程和python字典通过索引取值过程完全一致。JavaScript数据类型&#xff08;值&#xff09;对应的Python数据类型&#xff08;值&#xff09; JSONPythonobjectdictarraylist/tuplestring…

SQL基础知识整理--干货!常见的SQL面试题:经典50例!

SQL基础知识整理 select 查询结果&#xff0c;如: [学号,平均成绩&#xff1a;组函数avg(成绩)]from 从哪张表中查找数据&#xff0c;如:[涉及到成绩&#xff1a;成绩表score]where 查询条件&#xff0c;如:[b.课程号’0003′ and b.成绩>80]group by 分组&#xff0c;如:[…