如何设计一个高并发系统

news2025/1/14 2:49:48

目录

如何理解高并发系统

1. 分而治之,横向扩展

2. 微服务拆分(系统拆分)

3. 分库分表

4. 池化技术

5. 主从分离

6. 使用缓存

7. CDN——加速静态资源访问

8. 消息队列——削锋

9. ElasticSearch

10. 降级熔断

11. 限流

12. 异步

13. 常规的优化

14. 压力测试确定系统瓶颈

15. 应对突发流量峰值:扩容+切流量


设计高并发系统的15种方法。

如何理解高并发系统

       所谓设计高并发系统,就是设计一个系统,保证它整体可用的同时,能够处理很高的并发用户请求,能够承受很大的流量冲击

我们要设计高并发的系统,那就需要处理好一些常见的系统瓶颈问题,如内存不足、磁盘空间不足,连接数不够,网络宽带不够等等,以应对突发的流量洪峰。

1. 分而治之,横向扩展

       如果你只部署一个应用,只部署一台服务器,那抗住的流量请求是非常有限的。并且,单体的应用,有单点的风险,如果它挂了,那服务就不可用了。

因此,设计一个高并发系统,我们可以分而治之,横向扩展。也就是说,采用分布式部署的方式,部署多台服务器,把流量分流开,让每个服务器都承担一部分的并发和流量,提升整体系统的并发能力

2. 微服务拆分(系统拆分)

       要提高系统的吞吐,提高系统的处理并发请求的能力。除了采用分布式部署的方式外,还可以做微服务拆分,这样就可以达到分摊请求流量的目的,提高了并发能力。

所谓的微服务拆分,其实就是把一个单体的应用,按功能单一性,拆分为多个服务模块。比如一个电商系统,拆分为用户系统、订单系统、商品系统等等

3. 分库分表

       当业务量暴增的话,MySQL单机磁盘容量会撑爆。并且,我们知道数据库连接数是有限的。在高并发的场景下,大量请求访问数据库,MySQL单机是扛不住的!高并发场景下,会出现too many connections报错。

所以高并发的系统,需要考虑拆分为多个数据库,来抗住高并发的毒打。而假如你的单表数据量非常大,存储和查询的性能就会遇到瓶颈了,如果你做了很多优化之后还是无法提升效率的时候,就需要考虑做分表了。一般千万级别数据量,就需要分表,每个表的数据量少一点,提升SQL查询性能。

当面试官问要求你设计一个高并发系统的时候,一般都要说到分库分表这个点。

资料参考:

分库分表经典15连问

4. 池化技术

       在高并发的场景下,数据库连接数可能成为瓶颈,因为连接数是有限的。

我们的请求调用数据库时,都会先获取数据库的连接,然后依靠这个连接来查询数据,搞完收工,最后关闭连接,释放资源。如果我们不用数据库连接池的话,每次执行SQL,都要创建连接和销毁连接,这就会导致每个查询请求都变得更慢了,相应的,系统处理用户请求的能力就降低了。

因此,需要使用池化技术,即数据库连接池、HTTP 连接池、Redis 连接池等等。使用数据库连接池,可以避免每次查询都新建连接,减少不必要的资源开销,通过复用连接池,提高系统处理高并发请求的能力

同理,我们使用线程池,也能让任务并行处理,更高效地完成任务

资料参考:

细数线程池的10个坑

面试必备:Java线程池解析

5. 主从分离

       通常来说,一台单机的MySQL服务器,可以支持500左右的TPS10000左右的QPS,即单机支撑的请求访问是有限的。因此你做了分布式部署,部署了多台机器,部署了主数据库、从数据库。

但是,如果双十一搞活动,流量肯定会猛增的。如果所有的查询请求,都走主库的话,主库肯定扛不住,因为查询请求量是非常非常大的。因此一般都要求做主从分离,然后实时性要求不高的读请求,都去读从库,写的请求或者实时性要求高的请求,才走主库。这样就很好保护了主库,也提高了系统的吞吐。

当然,如果回答了主从分离,面试官可能扩展开问你主从复制原理,问你主从延迟问题等等。

资料参考:

面试必备:聊聊MySQL的主从

6. 使用缓存

       无论是操作系统,浏览器,还是一些复杂的中间件,你都可以看到缓存的影子。我们使用缓存,主要是提升系统接口的性能,这样高并发场景,你的系统就可以支持更多的用户同时访问。

常用的缓存包括:Redis缓存,JVM本地缓存,memcached等等。就拿Redis来说,它单机就能轻轻松松应对几万的并发,你读场景的业务,可以用缓存来抗高并发。

缓存虽然好用,但是要注意缓存使用的一些问题

  • 缓存与数据库的一致性问题
  • 缓存雪崩
  • 缓存穿透
  • 缓存击穿

资料参考:

使用Redis,你必须知道的21个注意要点

7. CDN——加速静态资源访问

       商品图片,icon等等静态资源,可以对页面做静态化处理,减少访问服务端的请求。如果用户分布在全国各地,有的在上海,有的在深圳,地域相差很远,网速也各不相同。为了让用户最快访问到页面,可以使用CDNCDN可以让用户就近获取所需内容。

什么是CDN?

Content Delivery Network/Content Distribution Network,翻译过来就是内容分发网络,它表示将静态资源分发到位于多个地理位置机房的服务器,可以做到数据就近访问,加速了静态资源的访问速度,因此让系统更好处理正常别的动态请求。

8. 消息队列——削锋

       我们搞一些双十一、双十二等运营活动时,需要避免流量暴涨,打垮应用系统的风险。因此一般会引入消息队列,来应对高并发的场景

假设你的应用系统每秒最多可以处理2k个请求,每秒却有5k的请求过来,可以引入消息队列,应用系统每秒从消息队列拉2k请求处理得了。

有些伙伴担心这样可能会出现消息积压的问题:

  • 首先,搞一些运营活动,不会每时每刻都那么多请求过来你的系统(除非有人恶意攻击),高峰期过去后,积压的请求可以慢慢处理;
  • 其次,如果消息队列长度超过最大数量,可以直接抛弃用户请求或跳转到错误页面;

9. ElasticSearch

   Elasticsearch,大家都使用得比较多了吧,一般搜索功能都会用到它。它是一个分布式、高扩展、高实时的搜索与数据分析引擎,简称为ES

我们在聊高并发,为啥聊到ES呢? 因为ES可以扩容方便,天然支撑高并发。当数据量大的时候,不用动不动就加机器扩容,分库等等,可以考虑用ES来支持简单的查询搜索、统计类的操作。

10. 降级熔断

       熔断降级是保护系统的一种手段。当前互联网系统一般都是分布式部署的。而分布式系统中偶尔会出现某个基础服务不可用,最终导致整个系统不可用的情况, 这种现象被称为服务雪崩效应

为了应对服务雪崩, 常见的做法是熔断和降级。最简单是加开关控制,当下游系统出问题时,开关打开降级,不再调用下游系统。还可以选用开源组件Hystrix来支持。

你要保证设计的系统能应对高并发场景,那肯定要考虑熔断降级逻辑进来。

11. 限流

       限流也是我们应对高并发的一种方案。我们当然希望,在高并发大流量过来时,系统能全部请求都正常处理。但是有时候没办法,系统的CPU、网络带宽、内存、线程等资源都是有限的。因此,我们要考虑限流。

如果你的系统每秒扛住的请求是一千,如果一秒钟来了十万请求呢?换个角度就是说,高并发的时候,流量洪峰来了,超过系统的承载能力,怎么办呢?

这时候,我们可以采取限流方案。就是为了保护系统,多余的请求,直接丢弃。

什么是限流:在计算机网络中,限流就是控制网络接口发送或接收请求的速率,它可防止DoS攻击和限制Web爬虫。限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。

可以使用GuavaRateLimiter单机版限流,也可以使用Redis分布式限流,还可以使用阿里开源组件sentinel限流。

面试的时候,你说到限流这块的话?面试官很大概率会问你限流的算法,所以就需要复习一下这几种经典的限流算法。

12. 异步

回忆一下什么是同步,什么是异步呢?以方法调用为例,它代表调用方要阻塞等待被调用方法中的逻辑执行完成。这种方式下,当被调用方法响应时间较长时,会造成调用方长久的阻塞,在高并发下会造成整体系统性能下降甚至发生雪崩。异步调用恰恰相反,调用方不需要等待方法逻辑执行完成就可以返回执行其他的逻辑,在被调用方法执行完毕后再通过回调、事件通知等方式将结果反馈给调用方。

因此,设计一个高并发的系统,需要在恰当的场景使用异步。如何使用异步呢?后端可以借用消息队列实现。比如在海量秒杀请求过来时,先放到消息队列中,快速相应用户,告诉用户请求正在处理中,这样就可以释放资源来处理更多的请求。秒杀请求处理完后,通知用户秒杀抢购成功或者失败。

13. 常规的优化

       设计一个高并发的系统,需要设计接口的性能足够好,这样系统在相同时间,就可以处理更多的请求。当说到这里的话,大家就可以跟面试官说说接口优化的一些方案了。

标接口优化方案

资料参考:

实战总结!18种接口优化方案的总结

14. 压力测试确定系统瓶颈

       设计高并发系统,离不开最重要的一环,就是压力测试。就是在系统上线前,需要对系统进行压力测试,测清楚你的系统支撑的最大并发是多少,确定系统的瓶颈点,让自己心里有底,最好预防措施。

压测完要分析整个调用链路,性能可能出现问题是网络层(如带宽)、Nginx层、服务层、还是数据路缓存等中间件等等。

loadrunner是一款不错的压力测试工具,jmeter则是接口性能测试工具,都可以来做下压测。

15. 应对突发流量峰值:扩容+切流量

       如果是突发的流量高峰,除了降级、限流保证系统不跨,我们可以采用这两种方案,保证系统尽可能服务用户:

  • 扩容:比如增加从库、提升配置的方式,提升系统/组件的流量承载能力。比如增加MySQL、Redis从库来处理查询请求。
  • 切流量:服务多机房部署,如果高并发流量来了,把流量从一个机房切换到另一个机房。



 

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

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

相关文章

算法刷题总结 (八) 前缀和

算法总结8 前缀和 一、前缀和的概念1.1、什么是前缀和?1.2、常见类型1.2.1、求数组前i个数之和1.2.2、求数组的区间和 二、经典例题2.1、求数组前i个数之和560. 和为 K 的子数组 - 前缀和哈希表525. 连续数组 2.2、求数组的区间和303. 区域和检索 - 数组不可变643. …

学系统集成项目管理工程师(中项)系列06b_信息系统安全管理(下)

1. 物理安全管理 1.1. 计算机机房与设施安全 1.1.1. 计算机机房 1.1.1.1. 机房场地选择 1.1.1.2. 机房空调、降温 1.1.1.2.1. 基本温度要求 1.1.1.2.1.1. 应有必要的空调设备,使机房温度达到所需的温度要求 1.1.1.2.2. 较完备空调系统 1.1.1.2.2.1. 应有较完…

C语言——隐式转换

目录 前言 隐式转换 1.整型提升 2.算数转换 前言 这里小编给大家简单的补充一下,一些有关C语言的知识点 隐式转换 由于转换形式的不同类型转换这里一共分为整型提升和运算转换两种形式 1.整型提升 在了解整型提升之前,这里我们需要先了解一下截断…

自媒体助手软件开发需具备哪些功能?

自媒体助手软件开发需具备哪些功能? 1、多平台多账号管理。 用户可以在单独的平台上管理其他平台的账号,不需要登录多个平台,为用户减少了大量的时间,与此同时可以记忆账号和密码,提供分组管理&#xff…

【C进阶】详解预处理指令

文章目录 预定义符号#define#define定义标识符#define定义宏#define替换规则#和##带副作用的宏参数宏和函数对比#undef命令行定义 条件编译文件包含头文件被包含的方式嵌套文件包含 其他预处理指令总结 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DA…

解码星地一体农机导航:无网作业,极致

星地一体系列农机导航最强大之处是在全国任何地方都拥有信号,即使是在偏远的戈壁滩也能作业,因为星地一体系列导航采用星地融合技术,彻底解决信号问题,通过卫星播发差分信号的服务,在中国,只要可见卫星&…

Windows下如何查看某个端口被谁占用被杀死占用进程

开发时经常遇到端口被占用的情况,这个时候我们就需要找出被占用端口的程序,然后结束它,本文为大家介绍如何查找被占用的端口。 1、打开命令窗口(以管理员身份运行) 开始—->运行—->cmd,或者是 windowR 组合键,…

Win10桌面我的电脑怎么调出来?最简单方法教学

Win10桌面我的电脑怎么调出来?有用户发现自己的电脑桌面没有我的电脑这个程序图标,每次要访问磁盘的时候,开启都非常的麻烦。那么怎么将这个图标设置到桌面显示呢?接下来我们一起来看看以下的解决方法吧。 方法一: 在开…

论文中参考文献的引用

论文中参考文献的引用 写在最前面删除特定格式的数字(带小中大括号等等)效果如下 设置参考文献格式设置编号格式设置段落格式效果 使用交叉引用去引用这些编号在需要插入参考文南引用的地方使用“交叉引用”快捷键进阶:为“交叉引用”设置快捷键 写在最前…

maven安装及配置IDEA

文章目录 下载下载完成后 解压可以得到如下的目录项 配置环境变量输入下列命令 出现 maven版本表示环境变量配置成功 配置本地仓库、镜像仓库、jdk版本配置本地仓库配置镜像仓库配置jdk版本 IDEA配置maven配置当前项目的maven配置其他项目的maven 下载 https://maven.apache.o…

威联通NAS文件共享 - 搭建SFTP服务并内网穿透实现在外远程访问

文章目录 前言1. 威联通NAS启用SFTP2. 测试局域网访问3. 内网穿透3.1 威联通安装cpolar内网穿透3.2 创建隧道3.3 测试公网远程访问 4. 配置固定公网TCP端口地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址4.3 测试使用固定TCP端口地址远程连接威联通SFTP 转载自远程内…

Java web 项目 和 java 项目的区别

一、Java Web项目 和 java项目区别 1. Java Web项目是基于Java EE类的;而Java项目是基于Java应用程序的。 2. Java Web项目是网页的编码,像jsp,servlet,struts这类的,而java项目是AWT,SWING这类的编码。 3. Java Web项目中的JAVA文件是tomcat…

【CocosCreator入门】CocosCreator组件 | Layout(布局)组件

Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中的Layout组件是一种用于实现节点自适应布局的重要组件。它可以根据不同的布局方式,自动调整子节点的位置和大小,从而实现节点的自适应布局。 目录 一、组件介绍…

准备换工作的看过来~

大家好,最近有不少小伙伴在后台留言,得准备面试了,又不知道从何下手!为了帮大家节约时间,特意准备了一份面试相关的资料,内容非常的全面,真的可以好好补一补,希望大家在都能拿到理想…

运行时内存数据区之方法区(二)

方法区的演进细节 首先明确:只有HotSpot才有永久代。BEA JRockit、IBMJ9等来说,是不存在永久代的概念的。原则上如何实现方法区属于虚拟机实现细节,不受《]Va虚拟机规范》管束,并不要求统一。Hotspot中方法区的变化: …

Spring核心-IoC控制反转详解 (典藏版)

文章目录 1.IoC容器和Bean介绍2.Spring 中的 IoC 容器2.1 BeanFactory和ApplicationContext概述2.2 BeanFactory2.3 ApplicationContext2.4 BeanFactory vs ApplicationContext2.5 容器的初始化2.6 配置元数据2.6.1 基于XML的容器配置2.6.2 基于注解的容器配置2.6.3 基于Java类…

Junit概述和快速入门

单元测试概述 在程序中,一个单元可以是一个完整的模块,但它通常是一个单独的方法或者程序 在面向对象的编程中,一个单元通常是整个界面,例如类,但可能是单个方法 JUnit是一个java编程语言的单元测试框架 通过先为最…

教育大数据总体解决方案(4)

组件配置 对组件中的项目配置项进行管理,包括节点内容、磁盘空间等等。每一次的配置都以一个配置版本的形式进行保存,用户可选择对应版本的查看对应的配置信息。 测度 对组件内的相关服务指标以图标形式进行状态呈现。可选择相应时间段,查看对…

scala闭包与柯里化

目录 通过闭包实现一个通用的两数相加函数简化柯里化 闭包:如果一个函数,访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,称为闭包 通过闭包实现一个通用的两数相加函数 这里内层函数访问了外…

【基础】Kafka -- 主题与分区

Kafka -- 主题与分区 主题的管理创建主题简单创建与查看指定分区副本分配创建指定参数创建 查看主题主题的简单查看带附加功能的查看 修改主题修改分区修改配置 删除主题 主题配置管理配置查看与变更配置查看配置变更 主题端参数 KafkaAdminClient 主题管理基本使用创建主题查看…