文档章节

一个系统过载的案例及其解决办法

zhongl
 zhongl
发布于 2012/11/12 16:00
字数 1037
阅读 665
收藏 6

系统出现过载现象(或问题)的原因和场景有很多, 这里并不试图归纳总结; 而是如题, 就一个特定的案例, 分享一些过载保护的实践办法.

案例

系统R需要通过轮询(读取)数据库中存储的记录状态, 进行一些业务补偿的操作, 而后再对数据库的状态进行更新.

轮询机制实现并未采用定时周期的方式, 而是采用 请求 - 响应 - 再请求 的事件驱动方式.

在压测的时候发现, 数据库访问(无论读写)大量失败, 错误日志狂刷.

分析

经排查, 由于数据库被多个系统公用, 其它系统的一些SQL执行耗时超长, 资源占用过多, 导致系统R的数据库访问请求超时失败, 而失败后的不断重试, 变本加厉, 最终数据库撑不住挂了.

类似的典型场景, 如 秒杀 :

海量并发请求下, 系统已经出现过载, 请求响应过缓, 而用户耐不住, 则不断尝试刷新页面, 寄期望于请求被响应. 可事与愿违, 系统在没有保护的情况下, 将持续超过载的状态, 直到 宕机.

解决

面对过载, 可能最容易被想到的是 扩容. 是的, 它是一种不降低服务质量的必不可少的预防方案, 但我们不得不接受一个事实:

系统的容量(或处理能力)始终是有限的, 即使不考虑成本的扩容, 也只能应付你可以预见程度, 一旦有个"万一", 系统仍将崩溃.

若服务可以降级, 则 限流 是能够应对"万一"的良方, 下面就 限流 这个思路, 分享几个办法.

定时

将轮询改用定时来实现, 就可以保证稳定的访问节奏, 加之一旦支持动态修改定时周期时间, 便可以根据实际情况灵活调整节奏了.

不仅做到了 限流 , 更是做到了 流控, 不错.

可以实际应用中会发现, 初始的定时周期很难找到合适的值, 需要在处理实时性和请求量之间平衡.

个人不太喜欢用定时方案, 它不仅让单元测试结果不稳定, 还浪费线程.

休息

请求 - 响应 - 再请求 的事件驱动的轮询方式, 有个好处: 就是在正常情况下, 让访问节奏由数据库说了算, 即数据库响应快, 轮询则快, 反之则放缓. 只可惜异常的情况下, 就如案例中那样.

休息很好理解:

若人累了, 就不要继续强撑, 让身体休息一会(踹口气), 再恢复工作.

同理, 当数据库访问失败后, 优雅地拒绝掉随后若干次请求, 让数据库休息一会.

如何做到优雅? 就本案例而言则是, 读取失败后的若干次请求迅速返回空集合. 总之, 拒绝可以是除抛异常外, 任何对处理逻辑有意义的默认NULL结果.

若干次到底是多少次? 这与选择定时时间一样是需要平衡的.

补偿

本案例中轮询的读取失败返回空集合是个好的休息办法, 可要是状态更新失败呢? 没法返回结果, 只能抛异常, 但异常又会导致重试, 这不仅没让数据库休息, 且可能导致大量ERROR Stacktrace日志输出.

不抛异常, 而将异常转换为一次失败记录(日志), 这些记录可以用来对数据库状态的不一致进行补偿操作, 具体如何补偿, 什么时机开始补偿, 这里就不展开细说了, 它们都需要由业务场景来决定.


写在最后, 上述三种办法都不是银弹, 也并非互斥, 完全可以根据情况结合使用的.

© 著作权归作者所有

共有 人打赏支持
zhongl

zhongl

粉丝 97
博文 28
码字总数 16630
作品 5
杭州
高级程序员
私信 提问
Magento 主机web server 的选择

我们安装Magento时, 都希望自己的Magento网站能运行飞快的, 在这就有着一个linux web程序的选择,下面是一些关于web server 的比较 server Apache Nginx Lighttpd Proxy代理 非常好 非常好...

rio
2010/05/07
895
0
服务器过载保护

服务器过载保护(上篇)——过载介绍 http://wetest.qq.com/lab/view/?id=69 1 何为过载 “过载”一词,在海量服务的后台开发中,基本都会遇到。何为过载,即当前负载已经超过了系统的最大处...

airxiechao
2016/04/28
157
0
2W台服务器、每秒数亿请求,微信如何不“失控”?

以下为译文: 最近我读了一篇论文《Overload control for scaling WeChat microservices(用于扩展微信微服务的过载控制)》,十分喜欢。 这篇论文主要分两部分:首先,我们能了解一些微信后...

CSDN资讯
2018/11/22
0
0
过载保护算法浅析

过载保护算法浅析 ShareCore2014-06-21538 阅读 算法 何为过载保护?所谓“过载”,即需求超过了负载能力;而“保护”则是指当“过载”发生了,采取必要的措施保护自己不受“伤害”。在计算机...

ShareCore
2014/06/21
0
0
OceanBase分布式系统负载均衡案例学习

一个集群如果出现了负载不均衡问题,那么负载最大的机器往往将成为影响系统整体表现的瓶颈和短板。为了避免这种情况的发生,需要动态负载均衡机制,以达到实时的最大化资源利用率,从而提升系...

yurnerola
2013/03/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的Table API及SQL Programs

序 本文主要研究一下flink的Table API及SQL Programs 实例 // for batch programs use ExecutionEnvironment instead of StreamExecutionEnvironmentStreamExecutionEnvironment env = Stre......

go4it
33分钟前
2
0
mysqldump应用

备份单个库/表数据或库/表结构 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 备份文件名 1、导出数据库为dbname的表结构(其中用戶名為root,密码为dbpasswd,生成的...

阿dai
40分钟前
1
0
shell脚本与Python的交互

1、Python针对shell获取传入,输出参数 传入:"$num" 例如: $0表示文件名,$1表示shell获取的第一个参数 输出:通过打印shell结果的方式,输出参数给Python。 例如: echo "{$iplist}",Python调...

一口今心
43分钟前
2
0
Euler 今日问世!国内首个工业级的图深度学习开源框架,阿里妈妈造

阿里妹导读:千呼万唤始出来!阿里妈妈正式公布重磅开源项目——图深度学习框架Euler。这是国内首个在核心业务大规模应用后开源的图深度学习框架。此次开源,Euler内置了大量的算法供用户直接...

阿里云官方博客
50分钟前
1
0
TiDB 3.0 Beta Release Notes

2019 年 1 月 19 日,TiDB 发布 3.0 Beta 版,对应 master branch 的 TiDB-Ansible。相比 2.1 版本,该版本对系统稳定性、优化器、统计信息以及执行引擎做了很多改进。 TiDB 新特性 支持 Vi...

TiDB
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部