`
zhengdl126
  • 浏览: 2542711 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

腾讯后台开发技术总监浅谈过载保护 小心雪崩效应

 
阅读更多

摘要: 每个系统,都有自己的最大处理能力,后台技术人员对此必须很清楚,且要注意自我保护,不然就会被雪球压垮,出现雪崩。

雪球:

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

腾讯后台开发技术总监bison,给大家分享了非常精彩的过载保护,其看似简单,但是要做好并不容易。这里用两个曾经经历的反面案例,给出过载保护的直观展现,并附上一点感想。

案例一 基本情况

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

进程A的时序是:

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

Step2: 进行本地逻辑处理

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

Step4: 等待后端系统B返回

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

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

正常情况下的负载

正常情况下:

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次。

正常情况下的负载

正常情况,后端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进程能够处理掉的请求个数(注意考虑网络通讯中的元数据)。

分享到:
评论

相关推荐

    传送带中大块煤识别检测数据集,使用yolov5pytorch格式对792张图片标注

    传送带中大块煤识别检测数据集,使用yolov5pytorch格式对792张图片标注,标注图片和标注信息可参考博文:https://backend.blog.csdn.net/article/details/144513245

    整体风格与设计理念 整体设计风格简约而不失优雅,采用了简洁的线条元素作为主要装饰,营造出一种现代、专业的视觉感受 配色上以柔和的色调为主,搭配少量鲜明的强调色,既保证了视觉上的舒适感,又能突出重点内容

    整体风格与设计理念 整体设计风格简约而不失优雅,采用了简洁的线条元素作为主要装饰,营造出一种现代、专业的视觉感受。配色上以柔和的色调为主,搭配少量鲜明的强调色,既保证了视觉上的舒适感,又能突出重点内容,使整个演示文稿在视觉上具有较强的吸引力和辨识度。 页面布局与内容结构 封面:封面设计简洁大方,“MORIMOTO” 和 “SENYAN” 字样增添了独特的标识性,可根据实际需求替换为汇报人姓名或公司名称等信息,让演示文稿从一开始就展现出专业与个性。 目录页:清晰列出 “工作内容回顾”“工作难点分析”“市场状况概述”“工作目标计划” 四个主要板块,方便观众快速了解演示文稿的整体架构和主要内容,为后续的详细展示做好铺垫。 工作内容回顾页(PART.01):提供了充足的空间用于详细阐述工作内容,可通过复制粘贴文本并选择只保留文字的方式,方便快捷地填充内容,建议使用微软雅黑字体以保证整体风格的一致性。无论是列举日常工作任务、项目执行细节还是工作成果总结,都能清晰呈现,让观众对工作内容有全面而深入的了解。 工作难点分析页(PART.02):这部分页面设计注重实用性,文本框可自由拉伸,方便根据工作难

    Python3数据分析与挖掘建模实战 学习代码开发

    python 【项目资源】:包含前端、后端、移动开发、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源,毕业设计等各种技术项目的源码。包括C++、Java、python、web、C#、EDA等项目的源码。 【适用人群】:适用于希望学习不同技术领域的初学者或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。

    【独家首发】基于matlab引力搜索算法GSA优化Transformer-BiLSTM负荷数据回归预测【Matlab仿真 6585期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【BP回归预测】基于matlab凌日算法优化BP神经网络TSOA-BP光伏数据预测(多输入单输出)【Matlab仿真 5170期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    基于java的门禁管理系统源代码(完整前后端+mysql+说明文档+LW).zip

    本系统主要包括两个角色:管理员、员工。 1.进出通道的权限:对每个通道设置哪些人可以进出,哪些人不能进出 2.门禁系统:进出方式:输入密码 3.进出通道的时段:就是设置可以该通道的人在什么时间范围内可以进出 4.出入记录查询功能:系统可储存所有的进出记录、状态记录,可按不同的查询条件查询 环境说明: 开发语言:Java,jsp JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea 部署容器:tomcat

    【ESN回归预测】基于matlab粒子群算法优化回声状态网络PSO-ESN数据回归预测【Matlab仿真 4383期】.zip

    【ESN回归预测】基于matlab粒子群算法优化回声状态网络PSO-ESN数据回归预测【Matlab仿真 4383期】

    玻璃盖板全球市场研究报告:2023年年复合增长率高达12.67%

    玻璃盖板全球市场研究报告:2023年年复合增长率高达12.67% 在科技日新月异的今天,玻璃盖板作为触控显示屏的重要部件,不仅承载着保护屏幕的重任,更以其卓越的性能和多样化的应用,成为连接科技与生活的桥梁。从智能手机到汽车电子,从工业控制到医疗器械,玻璃盖板无处不在,市场需求持续增长。然而,面对激烈的市场竞争和不断变化的用户需求,企业如何把握市场脉搏,实现创新发展? 市场概况 近年来,全球玻璃盖板市场呈现出蓬勃发展的态势。据QYR最新调研,2016年至2023年,全球玻璃盖板市场规模由116.2亿美元增长至267.6亿美元,年复合增长率高达12.67%。在国内市场,随着国产品牌智能手机出货量的稳步上升,以及应用领域的不断扩大,国产盖板玻璃取得了较大市场份额。我国玻璃盖板整体市场规模也由2016年的397.1亿元增长至2023年的788.6亿元,展现出强劲的增长势头。 技术创新与趋势 技术创新是推动玻璃盖板行业发展的核心动力。在加工领域,厂商不断引入新材料,改进生产工艺,持续提升玻璃盖板的性能。如耐磨性、耐高温性、防眩光性、防反射性、抗菌性等特性的提升,使得玻璃盖板更加适应市场需求。同时

    【故障诊断】基于matlab黑猩猩算法优化双向时间卷积神经网络ChOA-V2-BiTCN轴承数据故障诊断【Matlab仿真 5080期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    深圳混泥土搅拌站环境安全管理制度.docx

    深圳混泥土搅拌站环境安全管理制度

    人脸疲劳图像目标检测数据【已标注,约10,000张数据,YOLO 标注格式】

    人脸疲劳图像目标检测数据【已标注,约10,000张数据,YOLO 标注格式】 类别个数【2】:drowsy、undrowsy【具体参考classes文件】 数据集做了训练集、验证集划分,如果想要可视化数据,运行show脚本即可。 yolov5的改进实战:https://blog.csdn.net/qq_44886601/category_12605353.html 【更多图像分类、图像分割(医学)、目标检测(yolo)的项目以及相应网络的改进,可以参考本人主页:https://blog.csdn.net/qq_44886601/category_12803200.html】

    【故障诊断】基于matlab鹈鹕算法优化双向时间卷积神经网络POA-BiTCN轴承数据故障诊断【Matlab仿真 5106期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    第七章:循环控制语句 包含循环写星星 循环写乘法表 循环累加计算

    所有例程代码以及练习代码

    【温度预测】基于matlab灰狼算法优化BP神经网络GWO-BP温度预测【Matlab仿真 3422期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    Qt C++皮肤生成器 20套肤 26套精美界面 各种界面 一键肤 1. 自带17套精美皮肤样式,其中包括黑色、灰色、扁平等 2. 皮肤生成器只需要简单几步就可以生成一套自定义的皮肤 3. 自带了

    Qt C++皮肤生成器 20套肤 26套精美界面 各种界面 一键肤 1. 自带17套精美皮肤样式,其中包括黑色、灰色、扁平等。 2. 皮肤生成器只需要简单几步就可以生成一套自定义的皮肤。 3. 自带了26种uidemo,非常漂亮美观,涵盖了主界面布局、菜单切等各种效果,总有一款适合你。 4. 所有代码和demo注释都非常详细整齐整洁,非常适合初学者学习。 5. uidemo由简入难,可以一步步学习下去,从入门到熟悉。 6. uidemo从常规的客户端到app端到触摸端等都有,既有鼠标操作的也有触摸操作的。 7. 皮肤中的qss样式表内容,覆盖了几乎所有的控件,非常适合学习每个控件的qss样式如何设置,而且分门别类非常清晰。 8. 自带的quiwidget类,集大成之所长,超级牛逼,内置了无边框的消息框、错误框、询问框、右下角信息框、输入框、日期范围选择框等,支持倒计时关闭,集成图形字体设置方法及根据指定文字获取图片,集成CRC校验、获取应用程序文件名、文件路径、设置窗体居中显示、设置翻译文件、设置编码、设置延时、设置系统时间等各种静态方法,保你满意。 9. 支持任意Qt版本+任意编译器

    vscode的概要介绍与分析

    ### Visual Studio Code (VSCode) 资源描述 Visual Studio Code(简称 VSCode)是由微软开发的一款免费、开源的代码编辑器,支持多种编程语言,并拥有丰富的插件生态系统。它提供了智能感知、调试工具、Git 集成等功能,极大地提高了开发者的工作效率。 - **官方文档**:[VSCode 官方网站](https://code.visualstudio.com/) 提供了详尽的文档和技术支持,包括安装指南、用户手册、视频教程等。这是学习 VSCode 的最佳起点。 - **在线课程**:Coursera、Udemy 和 edX 等平台上提供了许多关于 VSCode 的课程,如《The Complete Visual Studio Code Course for Beginners》或《Full Stack Web Development with React & NodeJS》,可以帮助你从基础到高级逐步提升技能。 - **书籍**:虽然没有专门针对 VSCode 的书籍,但像《Pro Git》(作者: Scott Chacon 和 Be

    测试logicflow组件验证

    测试logicflow组件验证

    matlab仿真程序,二阶MASs,事件触发机制 这段代码是一个带有领导者的二阶多智能体的领导跟随一致性仿真 以下是对代码的分析: 1. 代码初始化了系统参数,包括邻接矩阵A、拉普拉斯矩阵L、系

    matlab仿真程序,二阶MASs,事件触发机制 这段代码是一个带有领导者的二阶多智能体的领导跟随一致性仿真。以下是对代码的分析: 1. 代码初始化了系统参数,包括邻接矩阵A、拉普拉斯矩阵L、系统的领导跟随矩阵H等。 2. 代码定义了一个二阶系统的微分方程模型,并使用RK4方法解方程。 3. 代码使用事件触发机制来控制智能体之间的通信和更新。每个智能体根据自身的位置和速度误差以及邻居智能体的误差信息来决定是否触发通信。 4. 代码通过绘制图像展示了系统的位置和速度状态、智能体在二维空间中的位置分布、控制输入和误差变化趋势等。 这段代码应用在多智能体系统的领导跟随问题中,通过控制输入和事件触发机制,实现了智能体之间的协同运动和领导者的跟随。算法的优势在于通过事件触发机制减少了通信开销,提高了系统的效率和鲁棒性。 需要注意的是,代码中的参数需要根据具体问题进行调整,包括邻接矩阵A、系统的领导跟随矩阵H、控制参数alpha、beta、lambda等。此外,代码中的事件触发条件也可以根据具体需求进行修改。 对于新手来说,从这段代码中可以学到以下几点: 1. 了解多智能体系统的领导跟

    【故障诊断】基于matlab黏菌算法优化双向时间卷积神经网络SMA-BiTCN轴承数据故障诊断【Matlab仿真 5097期】.zip

    CSDN Matlab研究室上传的资料均有对应的仿真结果图,仿真结果图均是完整代码运行得出,完整代码亲测可用,适合小白; 1、完整的代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    322222222111111111

    322222222111111111

Global site tag (gtag.js) - Google Analytics