高并发系统的三把利器

news2024/11/22 9:59:17

目录

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 应用拆分

应用的拆分:分布式 (微服务)

单体应用,随着业务的发展,应用功能的增加,单体应用就逐步变得非常庞大,很多人 维护这么一个系统,开发、测试、上线都会造成很大问题,比如代码冲突,代码重复,逻辑错综混乱,代码逻辑复杂度增加,响应新需求的速度降低,隐藏的风险增大,所以需要按照 「业务维度进行应用拆分,采用分布式开发」

应用拆分之后,就将原来在同一进程里的调用变成了远程方法调用,此时就需要使用到 一些「远程调用技」 httpClienthessiandubbowebservice 等;

随着业务复杂度增加,我们需要采用一些开源方案进行开发,提升开发和维护效率,比 如 DubboSpringCloud

通过应用拆分之后,扩容就变得容易,如果此时系统处理能力跟不上,只需要「增加服务 器即可」(把拆分后的每一个服务再多做几个集群)

4.2.2 数据库

1)数据库拆分

数据库拆分分为:「垂直拆分和水平拆分 (分库分表)」

 「按照业务维度把相同类型的表放在一个数据库,另一些表放在另一个数据库」,这种方式 的拆分叫「垂直拆分」,也就是在 不同库建不同表,把表分散到各个数据库

比如产品、订单、用户三类数据以前在一个数据库中,现在可以用三个数据库,分别为 「产品数据库、订单数据库、用户数据库」,这样可以将不同的数据库部署在不同的服务器上,提升单机容量和性能问题,也解决多 个表之间的 IO 竞争问题

根据数据行的特点和规则,将表中的「某些行切分到一个数据库,而另外的某些行又切分 到另一个数据库」,这种方式的拆分叫「水平拆分」

单库单表在数据量和流量增大的过程中,大表往往会成为性能瓶颈,所以数据库要进行「水平拆分」

2)读写分离 + 主从复制

3)数据库优化

4.3. 静态化

对于一些访问量大,更新频率较低的数据,可直接定时生成静态 html 页面,供前端访问,而不是访问 jsp

常用静态化的技术:freemakervelocity 定时任务,每隔 2 分钟生成一次首页的静态化页面

页面静态化首先可以大大提升访问速度,不需要去访问数据库或者缓存来获取数据,浏览器直接加载 html 页即可

页面静态化可以提升网站稳定性,如果程序或数据库出了问题,静态页面依然可以正常 访问

4.4.削峰

   削峰本质上是更多地延缓用户请求,层层过滤用户的访问需求,遵从“最后落地到数据库的请求数要尽量少”的原则

  1. 限流算法:通过限制单位时间内请求的数量或速率,来控制访问流量。常见的限流算法包括令牌桶算法和漏桶算法。

  2. 缓存:将一部分数据缓存在内存中,减少对数据库的访问次数,从而降低服务器压力。

  3. 负载均衡:将访问流量分散到多台服务器上,避免单一服务器过载,提高系统的可用性和稳定性。

  4. 异步处理:将一些耗时的操作异步处理,如发送邮件、生成报表等,避免阻塞主线程,提高系统的并发能力。

  5. 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使用

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

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

相关文章

【Proteus仿真】基于VSM 51单片机定时计数器闹钟例程

【Proteus仿真】基于VSM 51单片机定时计数器闹钟例程 🎬例程仿真功能操作演示: ✨本例程可从软件内部所提供的历程中找到,但是需要自行安装SDCC编译器才能对其源代码重新编译。 ⚡需要自行安装SDCC编译器。 🛠Proteus内部安装SDCC编译器方法 🌿将窗口切换到Source Co…

少儿编程 中国电子学会图形化编程等级考试Scratch编程四级真题解析(判断题)2023年3月

2023年3月scratch编程等级考试四级真题 判断题(共10题,每题2分,共20分) 11、在使用自定义积木时,不可以传递布尔型参数 答案:错 考点分析:考查自定义积木的使用,使用自定义积木的时候可以传递数字、文本和布尔型参数,所以错误 12、执行如下图程序后,输出的结果为“…

论文总结+公式分析

目录 1.Learning with Noisy Correspondence for Cross-modal Matching(NCR)1-1.贡献和创新点1-2.图1-2-1.总图1-2-2.Co-divide1-2-3. Co-Rectify1-2-4.Robust Cross-modal Matching 1.Learning with Noisy Correspondence for Cross-modal Matching(NCR) 1-1.贡献和创新点 提…

来报名丨下一代因子挖掘统一框架:打破界限的流式实时计算平台

大家期待已久的量化科技嘉年华,现在正式开启报名啦! 2023年6月2日-3日,DolphinDB 联合主办的 “2023量化科技嘉年华” 将在上海世博中心召开,本次大会主题涵盖因子/数据/交易/算法/算力,通过国内外顶尖量化金融专家最…

AIGC出击研发、营销,文心一言们要改变鞋服行业产业链条?

(图片来源于网络,侵删) 文 | 螳螂观察 作者 | 叶小安 你敢设想这样一种未来吗? 看到的消费品广告都是AI设计的,甚至连电影、电视甚至直播带货都是由AI机器人制作好的画面。 2022年尾,ChatGPT的诞生刷爆…

继内存条、固态硬盘后国产CPU再度发力,性能已媲美10代酷睿

这两年内存条、固态硬盘之内卷,放在整个电脑硬件发展历程中也是相当炸裂了。 国产厂商崛起带动了储存行业飞跃式发展,一是储存芯片成本大幅降低。 二是经历了前几年经济冲击,大家对 PC 电子产品需求明显下滑,各大厂库存难以消化。…

基于html+css的图展示78

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

DRMS-关于开展防范风险整改工作的工作计划

防范风险整改工作 工作计划 2023年5月10日 尊敬的【DRMS】集群用户: 根据河南省郑州市国家高新技术产业开发区市场监督管理局《关于河南数权数字信息科技研究院网络违规整改通知》及…

Unity 动画

Unity现存两套动画系统:Legacy动画系统和Mecanim动画系统。 Unity的Mecanim动画系统,是一套基于状态机的动画控制系统,是一个面向动画应用的动画系统 Animator Avatar:动画节点导引替身,与动画复用(尤其…

四信机房环境监测与安全预警解决方案

随着网络信息技术的不断发展,各行业对计算机依赖性显著提高,机房作为信息交换的枢纽,其数量及建设规模不断扩大。而机房系统的可靠与否直接关系着网络能否正常稳定的运行,因此企业必须严格按照国家相关标准和具体需要建立包含供配…

华为OD机试真题 Java 实现【数字加减游戏】【2023Q1 200分】

一、题目描述 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字s变成数字t。 每个回合,小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减,分别为a,其中b没有使用次数限制。 请问小明…

常用MQ介绍与区别

RabbitMQ RabbitMQ是实现AMQP协议(0.9.1) 的消息中间件的一种,由RabbitMQ Technologies Ltd开发并且提供商业支持的,最初起源于金融系统,服务器端用Erlang语言编写,用于在分布式系统中存储转发消息,在易用性、扩展性、…

bug:生产问题,Golang解决csv文件用excel打开中文乱码问题及常见编码和BOM头关系

bug:Golang解决csv文件用excel打开中文乱码问题 1 场景及分析 场景:今天在生成csv文件之后,测试发现用office和wps打开乱码 分析:经过测试之后发现使用记事本打开不乱码,同时用记事本打开之后另存为ANSI编码之后用off…

Vivado 下 IP核之 PLL实验

目录 实验任务:Vivado 下 IP核之 PLL实验 1、实验简介 2、实验环境 3、实验原理 3.1、PLL IP核简介 3.2、MMCM 和 PLL 各自的含义以及两者的区别 3.3、PLL 分频 和 倍频 的工作原理 3.4、实验任务 4、建立工程 4.1、PLL IP 核配置 4.2、模块设计 4.…

【STL模版库】vector的介绍及使用 {构造函数,迭代器,容量相关接口,增删查改;动态二维数组}

一、vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它…

DMGI:Unsupervised Attributed Multiplex Network Embedding

[1911.06750] Unsupervised Attributed Multiplex Network Embedding (arxiv.org) 目录 Abstract 1 Introduction 2 DGI 3 Deep Multiplex Graph Infomax: DMGI 特定关系类型的节点嵌入 Joint Modeling and Consensus Regularization Extension to Semi-Supervised Lea…

在线视频(海康,大华等摄像头)平台

项目下载地址 http://www.gxcode.top/code 功能: 1.接入设备 2.设备使用 3.国标级联 4.推流列表 5.拉流代理 6.电子地图 7.节点管理 8.云端录像 9.不间断录像 一.项目运行图 二.代码截图 1.在线视频前端 2.在线视频服务平台 3.在线视频录像服务平台

大型医学影像PACS系统源码 VC + MSSQL

PACS系统可以覆盖医院现有放射、CT、MR、核医学、超声、内镜、病理、心电等绝大部分DICOM和非DICOM检查设备,支持从科室级、全院级、集团医院级乃至到区域PACS的平滑扩展,能够与医院HIS、集成平台的有效集成和融合,帮助医院实现了全院医学影像…

软件测试技术课程:软件测试流程

软件测试流程如下: 测试计划测试设计测试执行 单元测试集成测试确认测试系统测试验收测试回归测试验证活动 测试计划 测试计划由测试负责人来编写,用于确定各个测试阶段的目标和策略。这个过程将输出测试计划,明确要完成的测试活动&#x…

linux内核篇-进程间通信(信号,管道,共享内存,socket)

信号机制 在linux操作系统中,为了响应各种各样的事件,也定义了很多信号。我们可以通过kill -l命令,查看所有的信号 # kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS …