系统过载及保护的思考

家用电器为了防止电流过大,都会有保险装置,当电流过大时,自动切断电流,防止电器损坏, 防洪大坝的水位超过了警戒线,会开闸泄洪,防止大坝崩溃. 而我们的服务系统如果一旦流量过大(用户或请求超过其处理能力),很多情况下,都把自己搞挂了,很显然,我们设计系统时没有像我们的工业及建筑领域那样成熟的引入自我保护机制.稍不注意就把自己搞挂了.

一个系统的处理能力是有限的,就如一个车站在车次一定的情况下(车辆一定,运力一定),每天可以输送2万名乘客, 如果逢年过节,赶上春运,一天来了25000名乘客,怎么办,多开几个售票窗口,多开几个进站通道,有用吗,显然,是没用的,肯定还有5000名乘客当天运送不了, 如果每天如此,持续10天,那么将有50000名乘客还在排队,假设所有的乘客都是按照先来后到的顺序依次上车,那么第11天来的第一名乘客,需要2.5天后才能乘车(需要等到前面50000人走完才能轮到自己)

假如我们的一个服务系统A处理的每一个请求都依赖一个下游系统B,系统B的吞吐量为2000/s .  不管你A系统开多少线程,B最终一秒钟为你服务2000次. 而且B的这个服务水平是无法因为A的优化而可以提高的(不管你怎么设计车站,和售票窗口,进站通道,你只有100俩运输客车,一天最多装2000人开走)如果A系统的请求数忽然增至2500,如果所有的请求都是先入队列,假设队列长度很大(可容纳10万)再依次处理。(其实基本上所有的系统也都是这样),那20秒后,就会积压有10000个请求未处理,那么第21秒过来的第一个请求,需要等到前面10000个请求都处理完,也就是5秒中后才能处理,如果A上游的系统读超时为5S,那么在系统过载的那一刻开始,第20秒,对于A的上游系统来看,整个A系统已经完全不可用了.假设这是个面向用户的互联网服务,那么系统目前的现状就是,当系统过载后(请求数超过了2000/s)20秒后的第一个请求需要5秒后才能被响应,用户的往往在等待若干秒发现系统没响应时就会不断的重试,导致了新的重复的请求越来越多,而之前的请求早已没有意义,可我们的系统还是很认真值守的处理之前的请求.
看起来,这就已经是个死循环了,无用的请求在大量占用系统的资源,新的请求被排在了最后,需要很久才能被处理,用户得不到响应,开始重试,请求越来越多,直到整个系统完全不可用。

那么我们怎么才能做到系统的自我保护呢,最简单有效的方式就是丢弃无用请求,当第一秒2500个请求过来时,我们只处理2000个请求,其他的请求可以在队列里直接丢弃,或者直接控制队列的入队速度,那么我们的系统还能正常的按照2000/s的水平提高服务,只是部分请求,也就是 1/5的请求被丢弃,第二秒也是这样,量力而行,只处理我们系统能够承受的服务。而不是尽力而为 . 对于超出自己处理能力范围的请求,要勇于拒绝.系统的能力只有这么多,既然无法提供2500的水平,那就提供2000的水平,最起码我们的服务还能服务4/5的请求.不至于像前面所述那么全部瘫痪.

时间: 2024-11-05 14:49:12

系统过载及保护的思考的相关文章

关于后台系统自动生成的一点思考

大量实践发现后台管理程序,其实90%的代码都是相同的,当然是在抛弃复杂逻辑业务的情况下,那么如何能高效的节约这些时间呢,那就是接下来我要说的,对于后台系统自动生成的一些思考. 适用情景: 1.表编号id为自增(基于现在大部分表编号都是自增的情况): 2.没有太复杂业务关联关系,比如表的某一个字段,存储了一个json对象,为了平衡后台用户使用,需要友好的分段展示给用户的定制ui界面:还比如表中存储了外键的多个id,但为了方便用户使用,只能已标签name的方式,给用户展示,等等这些超强业务黏合逻辑的

android系统掉电保护

/************************************************************************ * android系统掉电保护 * 说明: * Android系统突然掉电,可能会照成系统数据丢失.开不了等结果. * * 2016-6-8 深圳 南山平山村 曾剑锋 ***********************************************************************/ 参考文章: 一种android系统掉电

关于Linux系统basename函数缺陷的思考

某模块作为前台进程独立运行时,运行命令携带命令行参数:作为某平台下守护进程子进程运行时,需要将命令行参数固化在代码里.类似如下写法: char *argv[] = {"./DslDriver", "-t", "/bin/VdslModemSco.bin"}; int argc = sizeof(argv) / sizeof(argv[0]); 随后,调用basename函数(头文件为libgen.h)解析argv[0],即"./DslD

地铁事件对系统稳定性、可用性的思考

昨天晚高峰发生在北京地铁上的一件事情让我心里一直很难受,一个年轻的生命在地铁的两个自动门之间被夹身亡.姑且不论受害者的家属是什么样的一个心情,作为一个普通人,都会觉得非常的惋惜和愤恨.为什么地铁门不止一次的夺走了一条又一条的生命?不要以为这是一个"低概率事件"而默认事情的合理性.如果我们尊重人的生命,那么即使再低的概率也是付出了极高的代价,这种事情就不应该发生. 地铁夹人夺走生命的事情已经发生多次,此次在北京发生的事情早在2007年在上海就发生过,同样是被夹在屏蔽门和列车之间.在上海发

UAC可以给系统带来的保护

木马也好,其他恶意程序也好,如果不能和释放者保持联系,也就失去了威力.所以城门就是我们的最后一道防线.下面就来讲讲该如何让电脑更加安全. 用户可以关闭UAC或安全桌面当UAC提示要进行权限提升时,桌面会被锁定,只能接受Windows的进程通信.此时其他软件将无法与桌面进行交互,桌面也会变成灰色,这就是安全桌面功能.通过修改组策略,用户可以仅用安全桌面.禁用后,UAC提示对话框出现后,桌面将不再被锁定. 另外,用户甚至可以完全关闭UAC(虽然并不建议这样做).用户只需要禁用Run All Admi

系统存在过多开关的思考

一个系统通过配置文件或者数据库设置几个到几十个开关通常是没有问题,但是如果这个系统拥有上千个开关并且他们之间可能相互依赖,那对于开发.测试人员来说绝对是一个灾难.这样的灾难恰好出现在我之前维护的系统里面,代码大约有700万行代码,代码里面配置了几千个开关!系统很小的时候,能够应付得过去,这样做没有问题.当客户变多的时候,她们向需求人员提出了越来越多定制化要求,通常这些变化是无法拒绝的.况且这对公司也是有好处的,毕竟每一个变化是要算算钱的:另外通过不同需求可以攒出一个产品系统功能更加丰富,销售可以

系统问题解决的后的思考,处理问题的思路(oracle关不掉,起不来)

前言 应用支持A,接到业务部门反映公司的老总生产看板数据显示不了,联系开发组B,说是程序最近没有改动过,问题肯定在数据库让我检查数据库 查看报错ora-12541,检查数据库的监听,1521端口,均正常,线上的生产系统(与生产看板用的是同一个数据库),plsql都是正常.反应给开发组B,B说是程序没有改动,问题肯定在数据库. 因为不了解的生产看板的的数据架构,向B要应用连接数据库的配置参数,一直没给我 因为是公司总经理的事情,领导比较关注,应用支持A就一直说是数据库的问题,让重启数据库先 我一直

日志系统:字段类型的思考——String(字符串)、datetime(日期时间)、ip、int(整数)、float(小数)

日志本身用来记录事件,因此日志的内容应该包含: 事件发生的日期和时间: 精确度:毫秒(Java中最常用的时间单位).微秒数(PHP等其它语言中常用的时间单位).纳秒: 类型:datetime.double.long... 事件主体 类型:String 事件客体 类型:String 事件描述 类型:String 事件类型 类型:int.String... 事件级别: 类型:int.String 日志数据源的IP地址或名称: 类型:ip.String 汇总一下:int.long.double.Str

这里给大家整理了一些Linux系统运维相关的面试题,有些问题没有标准答案,希望要去参加Linux运维面试的朋友,可以先思考下这些问题

这里给大家整理了一些Linux系统运维相关的面试题,有些问题没有标准答案,希望要去参加Linux运维面试的朋友,可以先思考下这些问题. 一.Linux操作系统知识 1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块? 2.Linux开机启动流程详细步骤是什么?系统安装完,忘记密码如何破解? 3.企业中Linux服务器系统分区标准是什么?(以硬盘为300G,内存16G为例) 4.某一天突然发现Linux系统文件只读,该怎么办呢?完整操作步骤. 5.安装一台系