农林牧渔行业网站建设,合肥网站建设开发,局域网内建网站,seo是什么职务文章目录 前言并发和并行并发#xff08;Concurrency#xff09;并行#xff08;Parallelism#xff09;思考一下 前言
生活在 2023 年的互联网时代下#xff0c;又是在国内互联网越发内卷的背景下#xff0c;相信大家面试找工作、网上学习查资料时都了解过互联网系统设… 文章目录 前言并发和并行并发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 会直接拒绝新的客户端连接。