高并发系统的三把利器
目录
1.限流
2.缓存
2.1.缓存的使用场景
3.降级
3.1.什么是降级?
3.2.服务降级方式
4.其他高并发手段
4.1. 集群
4.2.拆分
4.2.1 应用拆分
4.2.2 数据库
4.3. 静态化
4.4.削峰
4.5.限流
5.总结
参考
保护高并发系统的三大利器:限流、熔断降级、缓存
- 限流:控制系统的请求量,防止系统被过度压力而崩溃。
- 缓存:将一些常用的数据存储在内存中,减轻数据库的压力,提高系统的响应速度。
- 降级:当系统不能承受更多的请求时,可以有意识地关闭一些不必要的功能或服务,以保证核心功能的正常运行。
1.限流
限流是保护高并发系统的三把利器之一。限流在很多场景中用来限制并发和请求量。实现系统限流的方式有很多种,比如令牌桶算法、漏桶算法等。
采用限流策略来控制用户的请求速率
限流常用的几种算法
1)计数器限流
你要是仔细看了上面的内容,就会发现上面举例的每秒阈值1000的那个例子就是一个计数器限流的思想,计数器限流的本质是一定时间内,访问量到达设置的限制后,在这个时间段没有过去之前,超过阈值的访问量拒绝处理,举个例,你告诉老板我一个小时只处理10件事,这是你的处理能力,但领导半个小内就断续断续给你分派了10件事,这时已经到达你的极限了,在后面的半个小时内,领导再派出的活你是拒绝处理的,直到下一个小时的时间段开始。
2)漏斗限流
漏斗限流,意思是说在一个漏斗容器中,当请求来临时就从漏斗顶部放入,漏斗底部会以一定的频率流出,当放入的速度大于流出的速度时,漏斗的空间会逐渐减少为0,这时请求会被拒绝,其实就是上面开始时池塘流水的例子。流入速率是随机的,流出速率是固定的,当漏斗满了之后,其实到了一个平滑的阶段,因为流出是固定的,所以你流入也是固定的,相当于请求是匀速通过的
2.缓存
2.1.缓存的使用场景
-
经常需要读取的数据
-
频繁访问的数据
-
热点数据缓存
-
IO 瓶颈数据
-
计算昂贵的数据
-
无需实时更新的数据
-
缓存的目的是减少对后端服务的访问,降低后端服务的压力
1)CDN 缓存
-
CDN
的全称是Content Delivery Network
,即内容分发网络。CDN
是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN
的关键技术主要有内容存储和分发技术。 -
CDN
它本身也是一个缓存,它把后端应用的数据缓存起来,用户要访问的时候,直接从CDN
上获取,不需要走后端的Nginx
,以及具体应用服务器Tomcat
,它的作用主要是加速数据的传输,也提高稳定性,如果从CDN
上没有获取到数据,再走后端的Nginx
缓存,Nginx
上也没有,则走后端的应用服务器,CDN
主要缓存静态资
2)应用缓存:
内存缓存
在内存中缓存数据,效率高,速度快,应用重启缓存丢失
磁盘缓存
在磁盘缓存数据,读取效率跟内存比较,磁盘缓存稍低,但应用重启缓存不会丢失3)
3)多级缓存
在整个应用系统的不同层级进行数据的缓存,多层次缓存,来提升访问效率;比如:浏览器 -> CDN -> Nginx -> Redis -> DB (磁盘、文件系统)
随着业务的不断增加,服务器性能很快又到达瓶颈
3.降级
降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的
3.1.什么是降级?
服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。
3.2.服务降级方式
延迟服务:定时任务处理、或者mq延时处理。
页面降级:页面点击按钮全部置灰,或者页面调整成为一个静态页面显示"系统正在维护中......"。
关闭非核心服务:比如电商关闭推荐服务、关闭运费险、退货退款等。保证主流程的核心服务下单付款就好。
写降级:比如秒杀抢购,我们可以只进行Cache的更新返回,然后通过mq异步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。
读降级:比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存
4.其他高并发手段
4.1. 集群
-
有一个单体应用,当访问流量很大无法支撑,那么可以集群部署,也叫单体应用「水平扩容」,原来通过部署一台服务器提供服务,现在就多部署几台,那么服务的能力就会提升。
-
部署了多台服务器,但是用户访问入口只能是一个,比如
www.evanshare.com
,所以就需要 「负载均衡」,负载均衡是应用集群扩容后的必须步骤,集群部署后,用户的会话session
状态 要保持的话,就需要实现session
共享。
4.2.拆分
4.2.1 应用拆分
应用的拆分:分布式 (微服务)
单体应用,随着业务的发展,应用功能的增加,单体应用就逐步变得非常庞大,很多人 维护这么一个系统,开发、测试、上线都会造成很大问题,比如代码冲突,代码重复,逻辑错综混乱,代码逻辑复杂度增加,响应新需求的速度降低,隐藏的风险增大,所以需要按照 「业务维度进行应用拆分,采用分布式开发」;
应用拆分之后,就将原来在同一进程里的调用变成了远程方法调用,此时就需要使用到 一些「远程调用技」 httpClient
、hessian
、dubbo
、webservice
等;
随着业务复杂度增加,我们需要采用一些开源方案进行开发,提升开发和维护效率,比 如 Dubbo
、SpringCloud
;
通过应用拆分之后,扩容就变得容易,如果此时系统处理能力跟不上,只需要「增加服务 器即可」(把拆分后的每一个服务再多做几个集群)
4.2.2 数据库
1)数据库拆分
数据库拆分分为:「垂直拆分和水平拆分 (分库分表)」
「按照业务维度把相同类型的表放在一个数据库,另一些表放在另一个数据库」,这种方式 的拆分叫「垂直拆分」,也就是在 不同库建不同表,把表分散到各个数据库
比如产品、订单、用户三类数据以前在一个数据库中,现在可以用三个数据库,分别为 「产品数据库、订单数据库、用户数据库」,这样可以将不同的数据库部署在不同的服务器上,提升单机容量和性能问题,也解决多 个表之间的 IO 竞争问题
根据数据行的特点和规则,将表中的「某些行切分到一个数据库,而另外的某些行又切分 到另一个数据库」,这种方式的拆分叫「水平拆分」
单库单表在数据量和流量增大的过程中,大表往往会成为性能瓶颈,所以数据库要进行「水平拆分」
2)读写分离 + 主从复制
3)数据库优化
4.3. 静态化
对于一些访问量大,更新频率较低的数据,可直接定时生成静态 html 页面,供前端访问,而不是访问 jsp
常用静态化的技术:freemaker
、velocity
定时任务,每隔 2 分钟生成一次首页的静态化页面
页面静态化首先可以大大提升访问速度,不需要去访问数据库或者缓存来获取数据,浏览器直接加载 html
页即可
页面静态化可以提升网站稳定性,如果程序或数据库出了问题,静态页面依然可以正常 访问
4.4.削峰
削峰本质上是更多地延缓用户请求,层层过滤用户的访问需求,遵从“最后落地到数据库的请求数要尽量少”的原则
-
限流算法:通过限制单位时间内请求的数量或速率,来控制访问流量。常见的限流算法包括令牌桶算法和漏桶算法。
-
缓存:将一部分数据缓存在内存中,减少对数据库的访问次数,从而降低服务器压力。
-
负载均衡:将访问流量分散到多台服务器上,避免单一服务器过载,提高系统的可用性和稳定性。
-
异步处理:将一些耗时的操作异步处理,如发送邮件、生成报表等,避免阻塞主线程,提高系统的并发能力。
-
CDN加速:通过将静态资源缓存在CDN节点上,加速用户对静态资源的访问,降低服务器压力
4.5.限流
通过削峰策略来平衡供需,从而保证系统的正常运行
像漏斗一样,尽量把数据量和请求量一层一层地过滤和减少,需要查询的用户,在缓存中能能查询到需要的信息,无需通过每次查询数据库,那么最后留下的,就是真正需要成交的客户,大大减轻DB的读写压力
1)分层过滤的核心思想
- 通过在不同的层次尽可能地过滤掉无效请求。
- 通过CDN过滤掉大量的图片,静态资源的请求。
- 再通过类似Redis这样的分布式缓存,过滤请求等就是典型的在上游拦截读请求。
2)分层过滤的基本原则
- 对写数据进行基于时间的合理分片,过滤掉过期的失效请求。
- 对写请求做限流保护,将超出系统承载能力的请求过滤掉。
- 涉及到的读数据不做强一致性校验,减少因为一致性校验产生瓶颈的问题。
- 对写数据进行强一致性校验,只保留最后有效的数据。
最终,让“漏斗”最末端(数据库)的才是有效请求。例如:当用户真实达到订单和支付的流程,这个是需要数据强一致性的。
5.总结
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一。
提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。前者垂直扩展可以通过提升单机硬件性能,或者提升单机架构性能,来提高并发性,但单机性能总是有极限的,互联网分布式架构设计高并发终极解决方案还是后者:水平扩展。
同时结合一些策略达到分流、限流的目的
1.对于秒杀这样的高并发场景业务,最基本的原则就是将请求拦截在系统上游,降低下游压力。如果不在前端拦截很可能造成数据库(mysql、oracle等)读写锁冲突,甚至导致死锁,最终还有可能出现雪崩等场景。
2.划分好动静资源,静态资源使用CDN进行服务分发。
3.充分利用缓存(redis等):增加QPS,从而加大整个集群的吞吐量。
4.高峰值流量是压垮系统很重要的原因,所以需要RocketMQ消息队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。
以上,为个人工作之余一些浅薄看法,记录下来,与诸位共享,不足之处,多多指点,感激不尽
参考
[1]高并发场景,你要如何实现系统限流?
[2]分布式高并发服务三种常用限流方案简介
[3] 九师兄的博客 - 高并发之限流 RateLimiter使用
相关文章:

高并发系统的三把利器
目录 1.限流 2.缓存 2.1.缓存的使用场景 3.降级 3.1.什么是降级? 3.2.服务降级方式 4.其他高并发手段 4.1. 集群 4.2.拆分 4.2.1 应用拆分 4.2.2 数据库 4.3. 静态化 4.4.削峰 4.5.限流 5.总结 参考 保护高并发系统的三大利器:限流、熔…...
AppiumWinAppDriver自动化测试 Failed to locate opened application window with appid问题
问题产生原因:1.期望能力选项参数丢失 例如:capabilities.setCapability("appWorkingDir", "C:\\Program Files (x86)\\Tencent\\app")) 某些app需要设置目录属性才可以启动。 问题产生原因:2.访问权限不足 例如&…...

渗透测试--6.1.aircrack-ng破解wifi密码
目录 1.Aircrack-ng简介 1.1 airdump-ng 1.2 aireplay-ng 1.3 aircrack-ng 2.Deauth攻击 3.aircrack-ng工具破解无线网络密码 步骤一:虚拟机连接实验需要用到的网卡 步骤二:设置网卡为监听模式 步骤三:使用wlan0mon网卡扫描附近wif…...

C++中的继承、以及赋值兼容转换。
一、继承的概念及定义 继承可以使代码复用,允许在保持原有类特性的基础上进行扩展。 举个例子:就好比我现在要封装老师、学生等这些人的属性和方法,但是这些人都有重复的属性和方法,比如name、age、sex等等,那么我可…...
js浏览器实现简单的实时扫一扫功能
描述:利用vue-qrcode-reader插件实现h5/wap端简单的扫一扫功能 参考文档:https://gruhn.github.io/vue-qrcode-reader/demos/Validate.html官方文档 安装插件 npm i --save vue3-qr-reader 或 yarn add vue3-qr-reader 注意项目运行必须在https下&…...

unity愤怒的小鸟学习制作(二)
终于又开始了啦啦啦,我有一个自己的相机了,真开心,诶嘿 视频链接和素材如下:视频 小鸟的飞出 想要让小鸟在拉开弹弓之后能飞出去,就必须让这个组件失活,如下 所以我们更改脚本内容,加入&#…...

干外包3年,彻底寄了...
先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了6年的功能测试&…...
软考高项论文范文(三)
论信息系统项目的沟通管理 【摘要】(该摘要共313个字符) 本文讨论了ⅹⅹ省社保系统民政统一软件开发项目的沟通管理。该项目是在国家大社会保险政策指导下于2018年10月份正式启动的。该系统为用户提供了优抚安置、救灾救济等十大主要业务功能。在本文中…...
浅谈谈谈OTA召回2023
近日,国家市场监督管理总局发布特斯拉召回公告,一下子掀起了互联网热议,这次召回的范围是在2019年1月12日至2023年4月24日期间国内销售特斯拉汽车(含国产和进口共计110万辆车),在这个召回公告中有两点值得关…...

【GDI+】旋转文本/斜体字
一、需求 想要绘制如下所示的斜体字,45度 二、分析&思路 Graphics类有个 RotateTransform方法,可以传入任意角度的值来旋转画板。但是这个方法的旋转中心是画板的左上角,所以直接单单用这个方法不能满足我们的需求。此外, G…...
python3 面试题总结
Python global 语句的作用lambda 匿名函数好处Python 错误处理Python 内置错误类型简述 any() 和 all() 方法Python 中什么元素为假?提高 Python 运行效率的方法Python 单例模式为什么 Python 不提供函数重载实例方法/静态方法/类方法__new__和 __init __方法的区别…...

select poll epoll有什么区别
select/poll select 实现多路复用的方式是,将已连接的 Socket 都放到一个文件描述符集合,然后调用 select 函数将文件描述符集合拷贝到内核里,让内核来检查是否有网络事件产生,检查的方式很粗暴,就是通过遍历文件描述…...

Java基础面试题突击系列1
👩🏻 作者:一只IT攻城狮 ,关注我不迷路 ❤️《java面试核心知识》突击系列,持续更新… 💐 面试必知必会学习路线:Java技术栈面试系列SpringCloud项目实战学习路线 📝再小的收获x365天…...
go-zero和dtm分布式事务实现
go-zero是一个基于Go语言的微服务开发框架,而DTM(Distributed Transaction Manager)是一个分布式事务管理器,用于实现跨多个微服务的分布式事务。 下面是使用go-zero和DTM实现分布式事务的基本步骤: 安装和配置DTM&am…...

Springboot +Flowable,会签、或签简单使用(一)
一.简介 **会签:**在一个流程中的某一个 Task 上,这个 Task 需要多个用户审批,当多个用户全部审批通过,或者多个用户中的某几个用户审批通过,就算通过。 例如:之前的请假流程,假设这个请假流程…...
银行面试中的即兴演讲技巧,你了解吗
面试的主要形式有无领导小组讨论、结构化和半结构化面试,一些银行还会出现辩论赛、角色扮演、即兴演讲等形式,今天小编就来聊一聊面试中的即兴演讲,从如信银行考试中心了解到: 简单来说即兴演讲就是在特定情境下,自发或…...
基于LT6911UXC的LVDS视频接口调试经验
文章目录 概要整体架构流程技术名词解释技术细节小结概要 项目方案采用龙讯半导体LT6911系列 整体架构流程 CPU主芯片采用飞腾,显卡采用GP102,由于项目需要LVDS接口,GP102的HDMI口输出后经过LT6911UXC转成LVDS输出 在本方案中有两种显示屏;一个是10.4寸,一个是15.6寸。…...
【C++】OpenMP简介
一、背景知识 1、program作用 #pragma 是 C 和 C 语言中的一个预处理指令。它主要用于向编译器发送特定的信息或者指示,以便控制编译过程。#pragma 通常与编译器特定的选项或功能一起使用,因此它的具体行为和实现可能因不同的编译器而有所不同。 #pra…...

Unity HybridCLR 热更工具学习日记(一)
目录 导入HybridCLR包、安装设置相关选项 导入HybridCLR包 先找到HybridCLR包的git地址:https://github.com/focus-creative-games/hybridclr 复制包的http地址,打开unity - window - package Manager;点击左上角的 选择Add Package for…...

内网渗透(七十五)之域权限维持之DCShadow
DCShadow 2018年1月24日,在BlueHat安全会议上,安全研究员Benjamin Delpy 和 Vincent Le Toux 公布了针对微软活动目录域的一种新型攻击技术------DCShaow。利用该攻击技术,具有域管理员权限或企业管理员权限的恶意攻击者可以创建恶意域控,然后利用域控间正常同步数据的功能…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...