浅谈过载保护

后台服务过载保护实现逻辑 后台服务过载保护的实现逻辑 阅读详情
摘要: 每个系统,都有自己的最大处理能力。后台人员对此要很清楚,且要注意自我保护,不然就会被雪球压垮。

雪球.jpg

雪球:对于时延敏感的服务,当外部请求超过系统处理能力,如果系统没有做相应保护,可能导致历史累计的超时请求达到一定规模,像雪球一样形成恶性循环。由于系统处理的每个请求都因为超时而无效,系统对外呈现的服务能力为0,且这种情况下不能自动恢复。

作者bison,腾讯后台开发技术总监。


  过载保护,看似简单,但是要做好并不容易。这里用两个曾经经历的反面案例,给出过载保护的直观展现,并附上一点感想。


案例一基本情况

  如下图,进程A是一个单进程系统,通过udp套接字接收前端请求进行处理。在处理过程中,需要访问后端系统B,是同步的方式访问后端系统B,根据后端系统B的SLA,超时时间设置是100ms。前端用户请求的超时时间是1s。


  进程A的时序是:


Step1: 从socket接收缓冲区接收用户请求


Step2: 进行本地逻辑处理


Step3: 发送请求到后端系统B


Step4: 等待后端系统B返回


Step5: 接收后端系统B的应答


Step6: 应答前端用户,回到step1处理下一个请求


1.gif


正常情况下的负载

  正常情况下:


1、前端请求报文大小约100Bytes。前端请求的峰值每分钟1800次,即峰值每秒30次。


2、后端系统B并行能力较高,每秒可以处理10000次以上,绝大多数请求处理时延在20ms内。


3、进程A在处理请求的时候,主要时延是在等待后端系统B,其他本地运算耗时非常少,小于1ms


  这个时候,我们可以看出,系统工作良好,因为处理时延在20ms内,每秒进程A每秒中可以处理50个请求,足以将用户每秒峰值30个请求及时处理完。


导火索

  某天,后端系统B进行了新特性发布,由于内部逻辑变复杂,导致每个请求处理时延从20ms延长至50ms,根据sla的100ms超时时间,这个时延仍然在正常范围内。当用户请求达到峰值时间点时,灾难出现了,用户每次操作都是“服务器超时无响应”,整个服务不可用。


过载分析

  当后端系统B处理时延延长至50ms的时候,进程A每秒只能处理20个请求(1s / 50ms = 20 )。小于正常情况下的用户请求峰值30次/s。这个时候操作失败的用户往往会重试,我们观察到前端用户请求增加了6倍以上,达到200次/s,是进程A最大处理能力(20次/s)的10倍!


   这个时候为什么所有用户发现操作都是失败的呢? 为什么不是1/10的用户发现操作能成功呢? 因为请求量和处理能力之间巨大的差异使得5.6s内就迅速填满了socket接收缓冲区(平均能缓存1000个请求,1000/(200-20)=5.6s),并且该缓冲区将一直保持满的状态。这意味着,一个请求被追加到缓冲区里后,要等待50s(缓存1000个请求,每秒处理20个,需要50s)后才能被进程A 取出来处理,这个时候用户早就看到操作超时了。换句话说,进程A每次处理的请求,都已经是50s以前产生的,进程A一直在做无用功。雪球产生了。


案例二基本情况

  前端系统C通过udp访问后端serverD,后端server D的udp套接字缓冲区为4MB,每个请求大小约400字节。后端serverD偶尔处理超时情况下,前端系统C会重试,最多重试2次。


2.gif


正常情况下的负载

  正常情况,后端serverD单机收到请求峰值为300次/s,后端serverD单机处理能力是每秒1500次,时延10ms左右。这个时候工作正常。


导火索

  由于产品特性(例如提前通知大量用户,未来某某时刻将进行一项秒杀活动;类似奥运门票,大量用户提前得知信息:某日开始发售门票),大量的用户聚集在同一时刻发起了大量请求,超出了后台serverD的最大负载能力。操作响应失败的用户又重试, 中间系统的重试,进一步带来了更大量的请求(正常情况下的9倍)。导致所有用户操作都是失败的。


过载分析

  只是导火索不一样,同案例一,巨大的请求和处理能力之间的鸿沟,导致后端serverD的4M大小的接收缓冲区迅速填满(4秒就填满),且过载时间内,接收缓冲区一直都是满的。而处理完缓冲区内的请求,ServerD需要6秒以上(4MB / 400 / 1500 = 6.7S)。所以serverD处理的请求都是6s之前放入缓冲区的,而该请求在最前端早已经超时。雪球形成了。


启示

1、  每个系统,自己的最大处理能力是多少要做到清清楚楚。例如案例一中的前端进程A,他的最大处理能力不是50次/s,也不是20次/S,而是10次/S。因为它是单进程同步的访问后端B, 且访问后端B的超时时间是100ms,所以他的处理能力就是1S/100ms=10次/S。而平时处理能力表现为50次/S,只是运气好。


2、  每个系统要做好自我保护,量力而为,而不是尽力而为。对于超出自己处理能力范围的请求,要勇于拒绝。


3、  每个系统要有能力发现哪些是有效的请求,哪些是无效的请求。上面两个案例中,过载的系统都不具备这中慧眼,逮着请求做死的处理,雪球时其实是做无用功。


4、  前端系统有保护后端系统的义务,sla中承诺多大的能力,就只给到后端多大的压力。这就要求每一个前后端接口的地方,都有明确的负载约定,一环扣一环。


5、  当过载发生时,该拒绝的请求(1、超出整个系统处理能力范围的;2、已经超时的无效请求)越早拒绝越好。就像上海机场到市区的高速上,刚出机场就有电子公示牌显示,进入市区某某路段拥堵,请绕行。


6、  对于用户的重试行为,要适当的延缓。例如登录发现后端响应失败,再重新展现登录页面前,可以适当延时几秒钟,并展现进度条等友好界面。当多次重试还失败的情况下,要安抚用户。


7、  产品特性设计和发布上,要尽量避免某个时刻导致大量用户集体触发某些请求的设计。发布的时候注意灰度。


8、  中间层server对后端发送请求,重试机制要慎用,一定要用的话要有严格频率控制。


9、  当雪球发生了,直接清空雪球队列(例如重启进程可以清空socket 缓冲区)可能是快速恢复的有效方法。


10、过载保护很重要的一点,不是说要加强系统性能、容量,成功应答所有请求,而是保证在高压下,系统的服务能力不要陡降到0,而是顽强的对外展现最大有效处理能力。


  对于“每个系统要有能力发现哪些是有效的请求,哪些是雪球无效的请求”,这里推荐一种方案:在该系统每个机器上新增一个进程:interface进程。Interface进程能够快速的从socket缓冲区中取得请求,打上当前时间戳,压入channel。业务处理进程从channel中获取请求和该请求的时间戳,如果发现时间戳早于当前时间减去超时时间(即已经超时,处理也没有意义),就直接丢弃该请求,或者应答一个失败报文。


  Channel是一个先进先出的通信方式,可以是socket,也可以是共享内存、消息队列、或者管道,不限。


  Socket缓冲区要设置合理,如果过大,导致及时interface进程都需要处理长时间才能清空该队列,就不合适了。建议的大小上限是:缓存住超时时间内interface进程能够处理掉的请求个数(注意考虑网络通讯中的元数据)。


3.gif

本文来自腾讯大讲堂(DJT.QQ.COM),转载请注明出处。

微服务过载保护原理与实战 在微服务中由于服务间相互依赖很容易出现连锁故障,连锁故障可能是由于整个服务链路中的某一个服务出现故障,进而导致系统的其他部分也出现故障。例如某个服务的某个实例由于过载出现故障,导致其他实例负载升高,从而导致这些实例像多米诺骨牌一样一个个全部出现故障,这种连锁故障就是所谓的雪崩现象 比如,服务A依赖服务C,服务C依赖服务D,服务D依赖服务E,当服务E过载会导致响应时间变慢甚至服务不可用,这个时候调用方D会出现大量超时连接资源被大量占用得不到释放,进而资源被耗尽导致服务D也过载,从而导致服务C过载以及整个系统雪 阅读详情

相关推荐

CPU 过载保护设计:如何在服务层面确保系统稳定?

这个词最早出现是在电路方面,在出现短路或者电压承载过大时,会触发电源的过载保护设备,该设备要不熔断、要不跳闸切断电源。在服务端也是相似的原理,首先我们需要设计一个过载保护的服务,在过载触发时,切断用户服务直接返回报错,在压力恢复时,正常响应用户请求。

我乐了的博客 1553

网页无法加载的常见原因及解决方法

网络能连上也能收到信息,就是网页打不开,一小段时间不用又刷新不出来了,这时候像是网页加载问题,虽然网络连接正常,但网页无法正常加载,或者在长时间不使用后需要重新刷新。逐步排除这些可能的原因后,问题应该能得到解决。如果依然无法解决,可能需要联系网络服务提供商或网站支持团队进一步诊断。6.桌面空白处右键刷新,然后打开浏览器正常使用。输入"control”回车,打开控制面板。5.取消勾选“为LAN使用代理服务器”1.快捷键win+R打开运行面板。2.点lnternet。然后点确定,之后再确定。

qq_46301912的博客 3万+

超实用!VS Code配置C/C++开发环境全攻略

本文提供了一份详细的VS Code配置C/C++开发环境全攻略。从MinGW-w64编译器的选择与安装,到VS Code核心扩展的配置,再到tasks.json构建任务与launch.json调试环境的设置,手把手指导初学者完成从环境搭建到高效开发与调试的全过程,帮助开发者快速上手C/C++项目。

weixin_28829479的博客 165

过载现象和原因

一点睛 过载保护是在系统过载的时候,对已有的系统进行保护——保证系统尽力提供服务,保证系统承载的正常请求时正常的,丢弃非正常请求,让服务始终对外维持在最大服务能力的范围内。 二什么是过载 1正常情况 系统正常时,一个包从客户端发出,到返回给客户端的全部顺风顺水。 2过载情况 系统单位时间内只能处理n个包,但客户给单位时候内给系统发送的包大于n,久而久之,各级缓存会出现丢包现象,出现客户端请求超时现象,如果该服务还存在上下游服务,过载会导致更严重的级联失败的现象——雪崩。 在分布式...

实践求真知 5065

网站服务器过载,服务器过载保护

服务器过载保护 内容精选换一换在不影响业务的情况下,通过容灾演练,模拟真实故障恢复场景,制定应急恢复预案,检验容灾方案的适用性、有效性。当真实故障发生时,通过预案快速恢复,提高业务连续性。存储容灾服务提供的容灾演练功能,在演练VPC(该VPC不能与容灾站点服务器所属VPC相同)内执行容灾演练。当容灾演练服务器创建完成后,生产站点服务器和容灾演练服务器同时独立运行,数据当生产站点可用区内的云服务器和...

weixin_42263617的博客 510

mysql过载保护_浅谈过载保护

雪球:对于时延敏感的服务,当外部请求超过系统处理能力,如果系统没有做相应保护,可能导致历史累计的超时请求达到一定规模,像雪球一样形成恶性循环。由于系统处理的每个请求都因为超时而无效,系统对外呈现的服务能力为0,且这种情况下不能自动恢复。作者bison,腾讯后台开发技术总监。过载保护,看似简单,但是要做好并不容易。这里用两个曾经经历的反面案例,给出过载保护的直观展现,并附上一点感想。案例一基本情况如...

weixin_39781783的博客 192

java系统过载保护_浅谈过载保护

浅谈过载保护雪球:对于时延敏感的服务,当外部请求超过系统处理能力。假设系统没有做对应保护,可能导致历史累计的超时请求达到一定规模,像雪球一样形成恶性循环。由于系统处理的每一个请求都由于超时而无效,系统对外呈现的服务能力为0,且这样的情况下不能自己主动恢复。作者bison。腾讯后台开发技术总监。过载保护,看似简单,可是要做好并不easy。这里用两个以前经历的反面案例,给出过载保护的直观展现,并附上一...

weixin_39543655的博客 256

负载均衡,异构服务器的负载均衡和过载保护

1. 什么是负载均衡? 负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据均匀分摊到多个操作单元上执行。负载均衡的关键在于均匀。 常见互联网分布式架构如上,分为客户端层,反向代理nginx层,站点层,服务层,数据层。可以看出,每一个下游都要多个上游调用,只需要做到,每一个上游都均匀访问每一个下游,就能实现“将请求/数据均匀分摊到多个操作单...

weixin_34293911的博客 248

服务器过载保护(上篇)——过载介绍

过载的定义看似简单,但却是处理过载问题的关键。

wetest_tencent的博客 9214

过载保护

过载保护,看似简单,但是要做好并不容易。这里用两个曾经经历的反面案例,给出过载保护的直观展现,并附上一点感想。 案例一 基本情况 如下图,进程A是一个单进程系统,通过udp套接字接收前端请求进行处理。在处理过程中,需要访问后端系统B,是同步的方式访问后端系统B,根据后端系统B的SLA,超时时间设置是100ms。前端用户请求的超时时间是1s。 进程A的时序是: Step1: 从socket

浮白 2121

2021-05-18

过保服务器不用换,彻底除尘后可继续用 服务器一般的保修期是三年,最多也就是五年。过保了的服务器,由于一些配件的老化,平时保养等问题,就会出现各种各样的问题。 过保的服务器经常出现的问题: 服务器的配件出现故障 常见服务器配件出现故障主要是:电源、电池、阵列卡、主板 2.服务器运行不稳定 服务器经常死机,运行太卡,或者经常重启。 3.服务器的噪声特别大 服务器的噪声特别大,一般都是由于服务器内部灰尘积累得太多,尤其是风...

lichen998的博客 953

服务过载保护设计与实施

一、概述 1.1 背景 过载保护是微服务系统无法绕过的技术难题,本文对过载保护的原因、解决方案、实施与测试闭环进行全流程的研究。 1.2 过载分析 过载后如果不进行保护,会导致资源耗尽,进而导致雪崩。过载有很多原因,大致如下: (1)资源不足,例如cpu、内存、io、存储空间、PID不足; (2)设计缺陷,例如代码逻辑问题导致处理效率低; (3)几率性业务重合,例如很多高io业务集中到一个节点上; (4)用户侧突发压力,例如大量用户在同一时间使用相同功能; (5)异常业务场景压力增加,例如

苏夫+ 1113

电机控制易混知识点1-基波频率/载波频率/采样频率

在电机控制学习工作中会接触到很多专业名词,其中基波频率,载波频率,采样频率是最常接触到的,特别对于电机控制小白开说,不容易理解,现对这几个概念做下总结归纳。

新能源电机控制工程师 | 聚焦实战问题,搭建互助平台 分享电机控制代码调试、现场故障排查、算法优化中的真实困惑;开放讨论电机基础知识以及工作中遇到难点等共性难题。拒绝单向输出,只做工程师的“技术树洞”与“解忧杂货铺”! 2121

COMSOL 6.0非线性超声仿真:奥氏体不锈钢应力腐蚀微裂纹检测

内容概要:本文详细介绍了使用COMSOL 6.0进行非线性超声仿真的方法,用于检测奥氏体不锈钢中的应力腐蚀微裂纹。主要内容涵盖材料属性设置、微裂纹建模、非线性表面波激励与检测、网格划分以及后处理技巧。文中强调了非线性效应的重要性,如Murnaghan三阶弹性常数的应用,并提供了具体的代码片段和参数设置指导。此外,还讨论了如何通过非线性表面波检测捕捉材料中微小缺陷引发的谐波信号,从而提高检测灵敏度。适合人群:从事材料科学、无损检测领域的研究人员和技术人员,尤其是熟悉COMSOL软件并希望深入了解非线性超声仿真的专业人士。使用场景及目标:适用于需要精确检测奥氏体不锈钢中应力腐蚀微裂纹的研究项目或工业应用。主要目标是通过非线性超声仿真,提高对微裂纹的检测灵敏度,确保材料的安全性和可靠性。其他说明:文中提到的技术细节和代码片段有助于读者更好地理解和实施非线性超声仿真,同时也提供了一些实际操作中的注意事项和优化建议。

上一篇: 如何更改数据库的单用户模式和多用户模式
下一篇: 自适应网页设计(Responsive Web Design)
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值