当前位置: 首页 > news >正文

聊聊接口最大并发处理数

文章目录

  • 前言
  • 并发和并行
  • 并发(Concurrency)
  • 并行(Parallelism)
  • 思考一下

前言

生活在 2023 年的互联网时代下,又是在国内互联网越发内卷的背景下,相信大家面试找工作、网上学习查资料时都了解过互联网系统设计三高指标,那就是高并发、高性能、高可用。本文主要讲高并发、高性能相关。本质上高性能也是为了给高并发铺平道路。而高并发设计中一部分也就是对应了本文主题接口最大并发数。

并发和并行

再开始讲并发之前,我需要再给大家回顾一些旧知识。
什么是并发?什么是并行…

并发(Concurrency)

早期计算机的 CPU 都是单核的,一个 CPU 在同一时间只能执行一个进程/线程,当系统中有多个进程/线程等待执行时,CPU 只能执行完一个再执行下一个。
计算机在运行过程中,有很多指令会涉及 I/O 操作,而 I/O 操作又是相当耗时的,速度远远低于 CPU,这导致 CPU 经常处于空闲状态,只能等待 I/O 操作完成后才能继续执行后面的指令。
为了提高 CPU 利用率,减少等待时间,人们提出了一种 CPU 并发工作的理论。
所谓并发,就是通过一种算法将 CPU 资源合理地分配给多个任务,当一个任务执行 I/O 操作时,CPU 可以转而执行其它的任务,等到 I/O 操作完成以后,或者新的任务遇到 I/O 操作时,CPU 再回到原来的任务继续执行。

虽然 CPU 在同一时刻只能执行一个任务,但是通过将 CPU 的使用权在恰当的时机分配给不同的任务,使得多个任务在视觉上看起来是一起执行的。CPU 的执行速度极快,多任务切换的时间也极短,用户根本感受不到,所以并发执行看起来才跟真的一样。

并行(Parallelism)

并发是针对单核 CPU 提出的,而并行则是针对多核 CPU 提出的。和单核 CPU 不同,多核 CPU 真正实现了“同时执行多个任务”。

多核 CPU 内部集成了多个计算核心(Core),每个核心相当于一个简单的 CPU,如果不计较细节,你可以认为给计算机安装了多个独立的 CPU。

多核 CPU 的每个核心都可以独立地执行一个任务,而且多个核心之间不会相互干扰。在不同核心上执行的多个任务,是真正地同时运行,这种状态就叫做并行。
例如,同样是执行两个任务,双核 CPU 的工作状态如下图所示:

双核 CPU 执行两个任务时,每个核心各自执行一个任务,和单核 CPU 在两个任务之间不断切换相比,它的执行效率更高。

思考一下

那么这里我们讲了关于并发、并行概念与我们的接口最大并发处理数之间有什么关系嘞?放心这都是铺垫,为了让你好消化后面的内容。
这里我给大家总结下并发与并行的概念:

并发:在同一时间段内,多个任务都在执行,但不一定是同时执行。这意味着这些任务在轮流使用 CPU 的时间片,给人一种它们在“同时”运行的错觉。并发的真正含义在于,尽管多个程序或进程可能正在运行,但每次只有一个进程或线程实际上正在使用 CPU。
并行:指在同一时刻,多个任务都在执行。这通常需要多个处理器或多核的 CPU 来实现,因为只有这样,每个处理器或核心才能在同一时刻执行一个任务。例如,当音乐软件和 IDEA 同时运行时,如果计算机有两个以上的 CPU 核心,那么这两个应用程序就可以真正地并行运行。

大家注意我上面加粗的字体,并发强调的是在同一段时间内,它是一个时间范围的概念。打个比方,并发是一个人同时吃三个馒头,吃完一个馒头需要 1 分钟,他就算胃口在大,也只能一个一个馒头吃,吃完三个需要花 3 分钟。
再看并行,并行强调的在同一时刻。打个比方,并行就是三个人同时吃三个馒头。这三个人可以在同一时刻一人吃一个馒头。吃完三个只需要花 1 分钟。
那么看到这里,我在问你个问题,3 个人的在 3 分钟内最多能吃多少个馒头?
相信大家都能告诉我。
理解接口的最大并发处理数
在 Java 语言里面,我们怎么理解并发跟并行嘞?还是跟吃馒头一样,我给大家打个比方,相信大家就明白了。
比如说我有一个接口,他的 RT (响应时长)是 50 毫秒,只有一个线程处理客户端请求,那这个线程在 1000 毫秒就能够处理 20 个客户端请求。
这里 20 就代表一个线程在 1 秒内的最大并发数。
那假如有两个线程处理客户端请求,接口的最大并发数是不是变成了 40,三个线程处理客户端请求,接口的最大并发数就变成了 60,以此类推。
这里我们就可以得出一个公式,线程个数 * 单线程最大并发数 就代表接口的最大并行处理数。
那么根据公式,我们得出一个结论,通过增大线程数或者减少接口响应时间可以增大接口的最大并发处理数。
聊聊 Tomcat 容器的并发处理配置
在 Spring Boot 发布后,Tomcat 就成为了 Spring Boot 默认的 web 容器。这里结合上文内容,给大家讲解下 Spring Boot 中涉及 Tomcat 服务器的一些关键参数,以及在高并发情况下如何通过这些参数来控制请求量。Spring boot 配置文件如下,

SpringBoot 版本:3.1.5

server:port: 8080tomcat:threads:max: 200min-spare: 10accept-count: 100max-connections: 8192server.port

该参数用于指定服务器监听的端口号。通过配置不同的端口号,可以实现多个服务在同一主机上并行运行。

这里为了方便大家理解,我用开饭店来给大家做比喻。通过指定服务器 ip + 启动端口,就相当于告诉顾客我们的饭店位置,等待顾客上门吃饭。

server.tomcat.threads.max
该参数定义了 Tomcat 服务器的最大线程数。在高并发情况下,可以通过增加最大线程数来提高服务器最大并发处理数的能力,但需要注意服务器的硬件资源限制。

threads.max 相当于设置饭店在最忙碌时候,需要的最大的服务员数量,假如说一个服务员只能服务 1 个客人,那么 200 个服务员就可以同时服务 200 个客人,注意这是并行服务哦。

server.tomcat.threads.min-spare
此参数用于设置服务器在空闲状态下保持的最小线程数。确保服务器在处理请求时有足够的线程可用,以避免延迟。

threads.min-spare 相当于设置饭店空闲时候需要的最少的服务员数量。

server.tomcat.max-connections
该参数指定服务器接受和处理的客户端最大连接数。超过这个限制后,会放入 accept-count 队列中

max-connections 相当于设置饭店空间内客人的最大容纳数量,注意是容纳,进了饭店的客人不是一进来就能享受服务的。往往还需要等待一段时间。这段时间就是当服务员服务上一个客人完毕后,有空出来的服务员才能给进店新客人服务。

server.tomcat.accept-count
此参数定义了当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。在高并发情况下,可以通过适当调整此参数来控制连接请求的排队长度。

accept-count 相当于设置饭店门口的排队人数大小。想一想我们外出吃饭的时候,什么情况需要排队,当然是店内爆满,没有座位。那么这个时候你就需要排个队了。注意如果说排队人都满了,怎么办?
这个时候饭店就会通知没有排上队,还想要假如排队的人,“你们不要排队了,今天吃饭人满了,大家去别处吃饭吧!”。
对应上 Tomcat 就是遇到客户端连接数量超过了 max-connections + accept-count 大小后的情况,此时 Tomcat 会直接拒绝新的客户端连接。

相关文章:

聊聊接口最大并发处理数

文章目录 前言并发和并行并发(Concurrency)并行(Parallelism)思考一下 前言 生活在 2023 年的互联网时代下,又是在国内互联网越发内卷的背景下,相信大家面试找工作、网上学习查资料时都了解过互联网系统设…...

6.如何利用LIO-SAM生成可用于机器人/无人机导航的二维/三维栅格地图--以octomap为例

目录 1 octomap的安装 2 二维导航节点的建立及栅格地图的构建 3 三维栅格地图的建立 1 octomap的安装 这里采用命令安装: sudo apt install ros-melodic-octomap-msgs ros-melodic-octomap-ros ros-melodic-octomap-rviz-plugins ros-melodic-octomap-server 这样…...

【多传感器融合】BEVFusion: 激光雷达和视觉融合框架 NeurIPS 2022

前言 BEVFusion其实有两篇, 【1】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework. NeurIPS 2022 | 北大&阿里提出 【2】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation 2022 | MIT提出 本文先分…...

kafka中的常见问题处理

文章目录 1. 如何防⽌消息丢失2. 如何防⽌重复消费3. 如何做到消息的顺序消费4. 如何解决消息积压问题4.1 消息积压问题的出现4.2 消息积压的解决⽅案 5. 实现延时队列的效果5.1 应用场景5.2 具体方案 1. 如何防⽌消息丢失 ⽣产者:1)使⽤同步发送 2&…...

HarmonyOS(八)——@Styles装饰器:定义组件重用样式

前言 在前面我们介绍过Builder装饰器和BuilderParam装饰器。今天我们继续介绍另外一个装饰器——Styles装饰器:定义组件重用样式。 如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴&…...

手写VUE后台管理系统5 - 整合状态管理组件pinia

整合状态管理组件 安装整合创建实例挂载使用 pinia 是一个拥有组合式 API 的 Vue 状态管理库。 pinia 官方文档:https://pinia.vuejs.org/zh/introduction.html 安装 yarn add pinia整合 所有与状态相关的文件都放置于项目 src/store 目录下,方便管理 在…...

解决webpack打包生成gz格式css/js文件没法在nginx使用的问题--全网唯一正确

本文绝对是全网解决这个问题唯一正确的文章,没有之一! 很多人都说开启nginx gzip压缩,这些人完全是胡说八道!你们到底懂不懂叫gzip压缩啊?! 不信你就试试,如果css/js只有gz文件,ng…...

传统算法: Pygame 实现快速排序

使用 Pygame 模块实现了快速排序的动画演示。首先,它生成一个包含随机整数的数组,并通过 Pygame 在屏幕上绘制这个数组的条形图。接着,通过快速排序算法对数组进行排序,动画效果可视化每一步的排序过程。在排序的过程中,程序选择一个基准元素(pivot),将数组分成两部分,…...

HarmonyOS入门开发(三) 持久化存储Preferences

接入鸿蒙几天以来,发现各种和Android不一样的地方,今天来看一下Preferences存储 在Android中比如有ShardPreferences、Mmkv这些持久化存储方式,开发起来很方便,读取速度也很快,在鸿蒙里面也提供了对应的持久化存储方案…...

类和对象——(3)再识对象

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 你说那里有你的梦想,…...

【UGUI】实现背包的常用操作

1. 添加物品 首先,你需要一个包含物品信息的类,比如 InventoryItem: using UnityEngine;[CreateAssetMenu(fileName "NewInventoryItem", menuName "Inventory/Item")] public class InventoryItem : ScriptableObje…...

单机zk安装与zk四字命令

一、下载 Apache ZooKeeper可以在 Linux 系统中使用 wget 命令直接下载,官网地址 Apache ZooKeeper 二、解压 tar -zxvf apache-zookeeper-3.8.3-bin.tar.gz 进去解压的目录中, 进入到 zk 解压目录的 conf 目录,复制 zoo_sample.cfg 文件&a…...

matlab导入excel数据两种常见的方法

在MATLAB中导入Excel数据,你可以使用几种不同的方法。下面是两种常见的方法: 方法一:使用readtable函数 readtable函数允许你导入Excel文件中的数据,并将其存储为表格。 % 指定文件路径 filename C:\your\path\to\file.xlsx;%…...

华为全屋智能5.0,无为而“智”

在赖特西塔里埃森混凝土墙的中心壁龛里,一块铜牌上刻着一些英文,意思是“建筑的意义不是屋顶和墙,而是人们生活于其中的空间”。 这句话,取自老子《道德经》中的“凿户牖以为室,当其无,有室之用”。 《理想…...

Flask 实现Token认证机制

在Flask框架中,实现Token认证机制并不是一件复杂的事情。除了使用官方提供的flask_httpauth模块或者第三方模块flask-jwt,我们还可以考虑自己实现一个简易版的Token认证工具。自定义Token认证机制的本质是生成一个令牌(Token)&…...

MATLAB 和 Simulink 官方文档下载地址

MATLAB 官方文档中文版下载网址: https://ww2.mathworks.cn/help/pdf_doc/matlab/index.html 如图: MATLAB 官方文档英文版下载网址: https://ww2.mathworks.cn/help/pdf_doc/matlab/index.html?langen 如图: Simulink 官…...

【Element】el-switch开关 点击弹窗确认框时状态先改变----点击弹窗取消框失效

一、背景 需求:在列表中添加定期出账的开关按钮,点击开关时,原来的状态不改变,弹出弹窗;点击弹窗取消按钮:状态不改变,点击弹窗确定按钮:状态改变,并调取列表数据刷新页…...

Java 中最常用的设计模式之一,工厂模式模式的写法,

文章目录 工厂模式1、简单工厂模式2、工厂模式3、抽象工厂4、总结 工厂模式 工厂模式是 Java 中最常用的设计模式之一,工厂模式模式的写法有好几种,这里主要介绍三种:简单工厂模式、工厂模式、抽象工厂模式 1、简单工厂模式 这里以制造cof…...

HTML的学习

知己知彼百战不殆 打算学习一下javascript 所以先从基础的html语言开始 其实就是头部 和身体 头部控制整个 html的语言 title等 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"width…...

JS设计模式 — 行为委托

回顾一下原型&#xff0c;发现[[Prototype]]机制就是指对象中的一个内部链接引用另一个对象&#xff0c;这个机制的本质就是对象之间的关联关系 1、面相委托的设计 Task {setID: function(ID) { this.id ID; },outputID: function() { console.log( this.id ); } }; // 让 …...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...