3.架构设计系列:高并发系统的设计目标

架构设计系列文章

  1. 架构设计系列:什么是架构设计
  2. 架构设计系列:几个常用的架构设计原则

一、如何理解高并发?

高并发,往往意味着大的流量,而大流量必然会对系统带来冲击。面对这种大流量的冲击,有的系统抗住了,有的系统被冲垮了。而抗住了的系统,一定程度上就是我们所谓的高并发系统。

简单来说,我们 所谓的高并发系统,就是一个面对大流量的冲击还能平稳运行的系统。

那如何理解高并发呢?

从对高并发系统的定义中可以看出,所谓的高并发,就是如何让系统面对大流量的冲击还能平稳运行。

那么,高并发到底是什么呢?

高并发,通常是指通过设计保证系统能够同时并行处理很多请求。

我们常见的高并发场景有:淘宝的双11、春运时的抢票、微博大V的热点新闻等。除了这些典型事情,每秒几十万请求的秒杀系统、每天千万级的订单系统、每天亿级日活的信息流系统等,都可以归为高并发。

很显然,上面谈到的高并发场景,并发量各不相同,那么,到底多大并发才算高并发呢?

  • 不能只看数字,要看具体的业务场景。
    不能说10W QPS的秒杀是高并发,而1W QPS的信息流就不是高并发。信息流场景涉及复杂的推荐模型和各种人工策略,它的业务逻辑可能比秒杀场景复杂10倍不止。因此,不在同一个维度,没有任何比较意义。

  • 业务都是从0到1做起来的,并发量和QPS只是参考指标
    在业务量逐渐变成原来的10倍、100倍的过程中,你是否用到了高并发的处理方法去演进你的系统,从架构设计、编码实现、甚至产品方案等维度去预防和解决高并发引起的问题?而不是一味的升级硬件、加机器做水平扩展。

各个高并发场景的业务特点完全不同:有读多写少的信息流场景、有读多写多的交易场景。因此,高并发本身是没有具体标准的,要结合具体的业务场景来看。


二、高并发系统的设计目标是什么?

1、宏观目标

高并发绝不意味着只追求高性能。从宏观角度看,高并发系统的设计目标有三个:高性能、高可用,以及高扩展。就是所谓的“三高”,三高不是孤立的,而是相互支撑的。

1.1 高性能

高性能体现系统的并行处理能力。 在有限的资源投入下,提高性能意味着节省成本。同时,性能也反映了用户体验,响应时间100毫秒和1秒,给用户的感受是完全不同的。

通常,对一个系统进行性能优化,我们首先要对系统性能瓶颈进行分析,然后再遵循二八原则,抓主要矛盾进行优化。

1.2 高可用

高可用表示系统连续提供服务的能力。 一个全年不停机、无故障;另一个隔三差五出线上事故、宕机,用户肯定选择前者。另外,如果系统只能做到90%可用,也会大大拖累业务。

高可用的方案主要从冗余、取舍、系统运维3个方向考虑,同时需要有配套的值班机制和故障处理流程,当出现线上问题时,可及时跟进处理。

1.3 高扩展

高扩展表示系统的扩展能力。 流量高峰时能否在短时间内完成扩容,更平稳地承接峰值流量,比如双11活动、明星离婚等热点事件。

1.4 小结

这3个目标是需要通盘考虑的,因为它们互相关联、甚至也会相互影响。

比如:考虑系统的扩展能力,你会将服务设计成无状态的,这种集群设计保证了高扩展性,其实也间接提升了系统的性能和可用性。

再比如:为了保证可用性,通常会对服务接口进行超时设置,以防大量线程阻塞在慢请求上造成系统雪崩,那超时时间设置成多少合理呢?一般,我们会参考依赖服务的性能表现进行设置。


2、微观目标

再从微观角度来看,高性能、高可用和高扩展又有哪些具体的指标来衡量?为什么会选择这些指标呢?

2.1 性能指标

通过性能指标可以度量系统目前存在的性能问题,同时作为性能优化的评估依据。

常用的一些性能指标如下:

1. 平均响应时间(平均RT)

响应时间是指从请求发出到收到响应花费的时间。该指标和用户体验息息相关,监控系统一般都有三个RT,即平均、最大、最小。平均响应时间,是最常用的指标,但是缺陷很明显,对于慢请求不敏感。

比如,1万次请求,其中9900次是1ms,100次是100ms,则平均响应时间为1.99ms,虽然平均耗时仅增加了0.99ms,但是1%请求的响应时间已经增加了100倍。

2. 分位值(TP90/TP99)

分位值指将响应时间从小到大排序,取前 N% 位置的值,即为该分位的值,分位值越大,对慢请求越敏感。

比如,TP90 表示排在第 90 分位的响应时间。相比平均响应时间,TP90,TP99等指标更能体现系统的稳定性。

比如,收集100个数据,从小到大排列,TP95 分位值就是取出第95个请求的响应时间做统计。 TP50分位值就是第50个请求的响应时间。如果能够保证 TP95 分位值的稳定性,就能很好的体现系统的稳定性。

3. 每秒查询率(QPS)/ 每秒处理事务数(TPS)

QPS即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。QPS = 请求数/秒,即每秒的响应请求数,也即是最大吞吐能力。

TPS即系统每秒处理的事务数量,一个事务是指一个客户端向服务器发送请求然后服务器做出反应的过程。

一般,评价系统性能均以每秒钟完成的交易数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。

QPS基本类似于TPS,但不同的是,一个TPS可以包含多个QPS。对于一个页面的一次访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。

比如,访问一个页面会请求服务器3次,此时,TPS=1 、QPS=3。

4. 并发数

并发数指系统同时能处理的请求数量,反映系统的负载能力。

计算公式:

  • 并发数 = QPS * 平均RT
  • QPS = 并发数 / 平均RT

比如,请求一个 index.html 页面,客户端发起了3个请求,此时,TPS=1 、QPS=3 、并发数=3。

注意,QPS不等于并发数,QPS是每秒HTTP请求数量,并发数是系统同时处理的请求数量。

5. 吞吐量(Throughput)

吞吐量指系统在单位时间内处理的请求数量,反映系统的承压能力,通常由QPS和并发数决定。

吞吐量和响应时间呈反比,比如响应时间是1ms,则吞吐量为每秒1000次。

一个系统的吞吐量与请求对CPU的消耗,外部系统接口,IO等等紧密关联。单个请求对CPU消耗越高,外部系统接口IO响应速度越慢,系统吞吐能力越低,反之越高。当某一项达到最高值,系统吞吐量就上不去了,假设压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其他消耗导致系统性能下降。

6. 综合浏览量(PV)

PV即页面浏览量或者点击量,一个访客在24小时内访问的页面数量。

7. 独立访客 (UV)

UV即一定时间范围内相同访客多次访问网站,只计算为一个独立的访客。

8. 最后,如何设定性能目标?

通常,对于高并发系统,设定性能目标时,必须同时考虑吞吐量、平均RT和TP分位值。

比如,每秒1万次请求,平均RT控制在50ms以下,TP99控制在100ms以下。

另外,从用户体验角度来看,200毫秒被认为是第一个分界点,用户感觉不到延迟,1秒是第二个分界点,用户能感受到延迟,但是可以接受。因此,对于一个健康的高并发系统,TP99应该控制在200毫秒以内,TP999或者TP9999应该控制在1秒以内。


2.2 可用性指标

可用性是一个可以量化的指标,行业内一般用 几个9 来表示系统的可用性指标。

计算公式:可用性 = 正常运行时间 / 系统总运行时间 × 100%。

下面来看看系统不同可用性等级的具体指标。

可用性等级年故障时间日故障时间描述
90%(1个9)36.5 天2.4 小时低可用
99%(2个9)3.65 天14.4 分基本可用
99.9%(3个9)8.76 小时1.44 分较高可用
99.99%(4个9)52.5 分钟8.6 秒高可用
99.999%(5个9)5.25 分钟0.86 秒极高可用
99.9999%(6个9)31.5 秒86 毫秒几乎完全可用

对于高并发系统来说,最基本的要求是:保证3个9或者4个9。原因很简单,如果你只能做到2个9,意味着有1%的故障时间,像一些大公司每年动辄千亿以上的GMV或者收入,1%就是10亿级别的业务影响。

但要想达到 3个9 或者更高等级是很困难的,这需要完整的监控运维体系和自动恢复能力,同时,还需要过硬的技术和大量的资金投入。


2.3 扩展性指标

在高并发系统这个领域下,扩展性通常指的是,增加的硬件资源与增加的处理能力之间的关系。

计算公式:扩展性 = 增加的处理能力 / 增加的硬件资源 × 100%。

对于集群方式部署的系统来说,理想的扩展能力是:资源增加几倍,性能提升几倍。通常来说,扩展能力要维持在 70%以上。

实际工作中,可以作为将增加资源的便捷程度,以及所耗费的时间,作为系统扩展性的关键指标。 因为这两者可以体现系统在扩展性上的成熟度。

下面我们来看看几个常见的扩展维度。

扩展维度描述
垂直扩展性硬件升降级时的耗时和可用性、性能提升幅度。
水平扩展性增减节点时的耗时和可用性、性能提升幅度。
数据扩展性数据存储的容量、数据读写的性能、数据分片和分区的灵活性以及数据一致性和可用性的维护程度。
服务扩展性服务间的解耦程度、服务的独立部署和扩展性、服务的水平和垂直扩展能力等。
运维扩展性系统的可监控性、可配置性、自动化运维的程度、故障处理和恢复的能力,以及系统的易用性和可维护性。

从高并发系统的整体架构角度来看,扩展的目标不仅仅是把服务设计成无状态就行了,因为当流量增加10倍,业务服务可以快速扩容10倍,但是数据库可能就成为了新的瓶颈。

像MySQL这种有状态的存储服务通常是扩展的技术难点,如果架构上没提前做好规划(垂直和水平拆分),就会涉及到大量数据的迁移。

因此,高扩展性需要考虑:服务集群、数据库、缓存和消息队列等中间件、负载均衡、带宽、依赖的第三方等,当并发达到某一个量级后,上述每个因素都可能成为扩展的瓶颈点。


三、高并发的通用实践方案有哪些?

了解了高并发设计的3大目标后,我们再来总结下通用的高并发设计方案。通用的设计方法主要是从「纵向」和「横向」两个维度出发,俗称高并发处理的两板斧:垂直扩展和水平扩展。

1、垂直扩展(scale-up)

垂直扩展的目标,是提升单机的处理能力。主要方案如下:

1. 提升单机的硬件性能

主要通过增加内存、CPU核数、存储容量、或者将磁盘升级成SSD等堆硬件的方式来提升。

2. 提升单机的软件性能

使用缓存减少IO次数,使用并发或者异步的方式增加吞吐量。


2、水平扩展(scale-out)

水平扩展的目标,是通过集群部署进一步提高处理能力,因为单机性能总会存在极限。主要方案如下:

1. 做好分层架构

这是水平扩展的前提,因为高并发系统往往业务复杂,通过分层处理可以简化复杂问题,更容易做到水平扩展。

2. 各层水平扩展

无状态做水平扩容,有状态做分片路由。业务集群通常能设计成无状态的,而数据库和缓存往往是有状态的,因此需要设计分区键做好存储分片,当然也可以通过主从同步、读写分离的方案提升读性能。


3、高并发的典型分层架构

分层关键技术
网络层- DNS: 实现地理级别的负载均衡,通常返回离用户距离比较近的IP。
- CDN: 解决用户网络访问时的“最后一公里”问题,即将内容缓存在离用户最近的地方,一般缓存的是静态资源,如图片、文件、CSS、Script脚本、静态网页等。
反向代理层- F5: 实现集群级别的负载均衡
- Nginx / LVS:实现机器级别的负载均衡
       - Nginx 是软件的 7 层负载均衡,LVS 是内核的 4 层负载均衡,F5 是硬件的 4 层负载均衡。
       - 软负载和硬负载的区别就在于性能,硬件远远高于软件;4 层和 7 层的区别就在于协议和灵活性。
业务服务层- 无状态: 应用通常被设计为无状态,那么应用就比较容易进行水平扩展。
- 拆分: 拆分的维度也比较灵活,需根据实际情况来选择。例如,根据系统维度、功能维度、读写维度、AOP 维度、模块维度、请求来源维度等等。
- 服务化: 拆分更多的是设计,服务化是落地,服务化一般都面临服务治理的问题。除了最基本的远程调用,还得考虑负载均衡、服务发现、服务隔离、服务限流、服务访问黑白名单等。甚至还有细节需要考虑,如超时时间、重试机制、服务路由、故障补偿等。
- 容器化: 容器化给运维带来了革命性的变化。基于Docker 打造自动化运维、智能化运维逐渐成为主流方式。容器化技术也天生适合当前流行的微服务,容器将微服务进程隔离到更小的实例里,结合容器编排技术,可以更方便快速地搭建服务高可用集群。
缓存层- 多级缓存: 在不同层级对数据进行缓存,来提升访问效率。
- 分布式缓存: 一般采用分片实现,即将数据分散到多个实例。
- 本地缓存: 将热点数据缓存到本地,降低分布式缓存的压力。
- 常见问题: 缓存穿透、缓存击穿、缓存雪崩、热key、大key等。
存储层- 读写分离: 分散读写操作的压力。
       - 主机负责读写操作,从机只负责读操作,例如一主一从、一主多从。
- 分库分表: 分散数据存储的压力。
       - 业务分库:按照业务维度将数据分散到不同的数据库服务器,突破单库引起的性能瓶颈。
       - 垂直分表:将表中某些不常用且占了大量空间的列拆分出去,适合列很多且不常用的表。
       - 水平分表:将表中数据按照某种路由算法切分到字表中,适合数据量特别大的表。

四、最后

「简单总结一下」:高并发确实是一个复杂且系统性的问题。因此,在做高并发设计时,同样要秉承架构设计的3个原则:简单、合适和演进“过早的优化是万恶之源”,不能脱离业务的实际情况,更不要过度设计,合适的方案就是最完美的。另外,如果业务场景不同,高并发的落地方案也会存在差异,但是总体的设计思路和可借鉴的方案基本类似。

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

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

相关文章

udp异步方式接收消息

C#实现 //定义结构体 public struct UdpState { public UdpClient u; public IPEndPoint e; } private UdpClient _client; //_client的初始化请参考其他资料 IPEndPoint remoteEP null; //TODO //public static bool mess…

电脑IP地址密码寻找指南:解密如何快速获取IP地址登录密码?

在使用电脑时,你可能会遇到需要查找IP地址登录密码的情况。而对于大部分普通用户来说,这项任务并不容易。那么,IP地址密码到底在哪里找呢?本文将为你详细解析,提供一些方法和技巧,帮助你快速找到电脑的IP地…

内存之-LeakCanary

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、使用四、原理分析4.1 自动初始化4.1.1 初始化…

人工智能_机器学习074_SVM支持向量机_软间隔与优化目标函数构建_C参数由来_惩罚误差点的惩罚度---人工智能工作笔记0114

然后我们接着上一节再来看一下这里我们说有个 min_faces_per_person = 0 这个可以看到如果我们写上0,就意味着要加载所有的人脸图片,就会花费的时间久对吧 我们可以试试,这里我们 min_faces_per_person = 0 改成0然后 我们等一会加载完了以后,我们用 display(X.shape,faces.sh…

Jenkins安装与设置(插件安装失败,版本问题解决)

早期的使用docker安装jenkins的方法会出现插件无法安装的问题,是由于docker拉取的jenkins版本太低了 jdk安装 Linux系统安装JDK1.8 详细流程 maven安装: centos7下安装Maven 使用docker进行安装jenkins: 先把镜像和容器卸干净 docker ps -a…

LinuxPTP在汽车时钟同步网络中的实践

这里列举一些在汽车以太网中使用LinuxPTP的注意点。 请使用较新版本的LinuxPTP,可以自己编译部署! 在使用中,我遇到了某些指令或者配置文件关键字已经废弃,官方网页中的文档和实际工具对不上的问题。 研究发现是目标板中部署的Li…

vue data变量不能以“_”开头,否则会产生很多怪异问题

1、 比如给子组件赋值&#xff0c;子组件无法得到这个值&#xff08;也不是一直无法得到&#xff0c;设置后this.$forceUpdate() 居然可以得到&#xff09;&#xff0c; 更无法watch到 <zizujian :config"_config1"> </zizujian>this._config1 { ...…

python使用easyocr识别文字,准确率超高!

文章目录 一、文档二、使用1、安装2、使用3、下载模型4、配合pyautogui识别屏幕的文字 参考资料 一、文档 https://www.jaided.ai/easyocr/documentation/ 二、使用 1、安装 pip install easyocr2、使用 import easyocr# 创建EasyOCR Reader reader easyocr.Reader([ch_s…

Go 错误处理

Go 错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error类型是一个接口类型&#xff0c;这是它的定义&#xff1a; type error interface {Error() string }我们可以在编码中通过实现 error 接口类型来生成错误信息。 函数通常在最后的返回值中返回错误…

python中的 multiprocessing.Event是什么

multiprocessing.Event 是 Python 中 multiprocessing 模块提供的一种同步原语&#xff0c;用于在多个进程之间传递信号。Event 本质上是一个用于线程/进程通信的信号标志&#xff0c;可以用于在不同进程之间进行事件的同步。 文章目录 创建 Event 对象在一个进程中设置 Event在…

短视频矩阵系统的崛起和影响

近年来&#xff0c;短视频矩阵系统已经成为了社交媒体中的一股新势力。这个新兴的社交媒体形式以其独特的魅力和吸引力&#xff0c;迅速吸引了大量的用户。这个系统简单来说就是将海量短视频整合在一个平台上&#xff0c;使用户可以方便地观看和分享好玩有趣的短视频。 短视频…

观察者模式学习

观察者模式&#xff08;Observer Design Pattern&#xff09;也被称为发布订阅模式&#xff08;Publish-Subscribe Design Pattern&#xff09;。在 GoF 的《设计模式》一书中&#xff0c;它的定义是这样的&#xff1a; Define a one-to-many dependency between objects so th…

50个免费的 AI 工具,提升工作效率(附网址)

上次我们已经介绍了20个精选的提高工作效率的免费AI工具&#xff0c;但如果你觉得这些AI工具还不过瘾的话&#xff0c;想进一步成为职场中最了解AI的人&#xff0c;本文将汇总介绍免费最新的50个AI工具。 DeepSwap DeepSwap 是一个基于 AI 的工具&#xff0c;适用于想要制作令人…

【内存泄漏】内存泄漏及常见的内存泄漏检测工具介绍

内存泄漏介绍 什么是内存泄漏 内存泄漏是指程序分配了一块内存&#xff08;通常是动态分配的堆内存&#xff09;&#xff0c;但在不再需要这块内存的情况下未将其释放。内存泄漏会导致程序浪费系统内存资源&#xff0c;持续的内存泄漏还导致系统内存的逐渐耗尽&#xff0c;最…

android内存管理机制概览

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、相关概念3.1 垃圾回收3.2 应用内存的分配与回…

插入排序详解(C语言)

前言 插入排序是一种简单直观的排序算法&#xff0c;在小规模数据排序或部分有序的情况下插入排序的表现十分良好&#xff0c;今天我将带大家学习插入排序的使用。let’s go ! ! ! 插入排序 插入排序的基本思想是将待排序的序列分为已排序和未排序两部分。初始时&#xff0c…

商务大厦安装电气火灾监控系统,从源头监控电气火灾

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;介绍分析剩余电流式电气火灾监控系统的特点、组成、设计依据、监控原理和实施方案&#xff0c;并结合上海市某大厦工程设计实例探讨该系统在高层建筑中的设置要求和应用方式&#xff0c;供设计人员参考。 关键词&…

蓝桥杯嵌入式LED

1.LED原理图 2.CubeMX的LED的GPIO 3.创建LED.c和.h文件添加到bsp文件 添加bsp文件路径在c/c中 4.LED相关代码

Django之DRF框架三,序列化组件

一、序列化类的常用字段和字段参数 常用字段 字段名字段参数CharFieldmax_lengthNone, min_lengthNone, allow_blankFalse, trim_whitespaceTrueIntegerFieldmax_valueNone, min_valueNoneFloatFieldmax_valueNone, min_valueNoneBooleanFieldNullBooleanFieldFloatFieldmax_…

【隐私保护】使用Python从文本中删除个人信息:第一部分

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…