版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、采用断路器设计模式来保护软件-编程开发技术采用断路器设计模式来保护软件木文由importnew乔永琪 翻译自indu alagarsamy。欢迎加入翻译小组。转载请见文末要 求。程序员的人生就像在一个快车道上行驶。几周甚至几小时完成某些特性编码,打 包测试没冇问题,盖上qa认证,代码部署到生产环境。然而最坏的事情发生了, 你所部署的软件在运行中挂掉了。用墨菲法则来说,就是“会出错的,终将出 错”。但是,如果我们在写代码吋就能考虑到这些问题会怎样?那么我们该如何应对,将不好的事情转变为好的事情呢?101000011011010 00101001101001 01000101010010idloo
2、ui101010010101010 10111001111100011 0010101010电子技术拯救了我们至今记得我和哥哥因为电涌不得不更换家里的保险丝情景,那时我对事件的严重 程度一无所知,而他却已经是电力方而的小能手了。保险丝完全烧坏了,但它却 保护了我家的电视机。在电子工程领域,保险丝和断路器用(circuit breaker) 來处理这样的问题,即超大功率可能带來一些严重的破坏,譬如毁坏电了设备甚 至烧掉整个屋子。保险丝包含一个小电线丝,电量过人时就会融化,就像烧掉的 电灯泡,阻止危险的电流,保护了电器和房屋。保险丝演变成断路器,通常利用电磁铁就可以断开电路,而不用烧掉它,这样断
3、路器就可以重置反复地用。不过,它们的功能都是一样的,检测负载,接着迅速 停止工作,保全其它部分不受破坏。冋过头再想,这是一个多么神奇的概念。仅仅坏掉某个控件保险丝彻底坏掉, 就可以避免了整个系统的严重损坏。多亏电涌后保险丝自熔,保住了电视机。那 么我们可不可在软件屮做同样的事情?坏事发生后,软件屮的某个控件会迅速停 止工作。模仿现实生活中的场景,由此我们创造了断路器设计模式。在分布式系统屮,某些故障是短暂的,通过快速连续重试就可以解决问题;但在 某些场景中,关键依赖的连接丢失了,短时间无法恢复。比如,某个应用失去了 与云中的持续化存储连接。在这样的场景中,关闭服务就可以避免错课的数据处 理过程
4、、其至数据丢失或者级联故障,进而防止对系统其它部分的进一步损坏。借助于迅速停止工作(failing fast),运维系统就可以容易地进行监控和响应。 在它们重视起来之前,那些徒劳尝试重新连接的服务看起来仍然是正常的,因为 本应该拉响的警报没冇响起。倘若某个服务在恰当的吋候彻底失效,警告灯熄灭 t,运维人员就会知晓问题所在,并及时做出响应。断路器设计模式在系统中可重用基础架构实现断路器设计模式是很容易实现的,它是这么发挥作 用的:1定义一个可重用的circui tbreaker类,包含trip和reset方法,以及断路器 跳闸就可以调用的action2利用circuitbreaker去监控系统依
5、赖。针对每个单一的故障,断路器跳闸就 会将其设置在一种布防状态,就像电涌出现时那样。3倘若接下来在特定的吋间窗口内尝试成功,那么就重置此断路器,一切恢复正 常。4倘若断路器没有在特定的时间重置,异常会持续发生,此时断路器就会调用你 捉供的actiono你可以在断路器跳闸时选择快速停止工作(终止进程)或者其 他 actiono应用案例 木例中extcrnalserviccadaptcr类帮助系统与外部依赖建立连接。或许有个网 络程序产生请求频繁地执行dos tuff操作。一旦执行,若此时getconnection 执行出错,界常就会发生,断路器就会被跳闸。倘若连接重新建立起来,断路器 就会被重置
6、。不过连接异常持续发生吋,断路器就会跳闸,特定的跳闸action 就会执行,在本例中将会迅速停止工作。public class extcrndlscrviccadeipterprivate circuitbreaker circuitbreaker;public externalserviceadapter() circuitbreaker = new circuitbreaker(z,checkconnection,/, /*断路 器名称*/exception => /* 一旦断路器跳闸此action就会被调用*/ console. writclinc(circuit breaker
7、tripped! fail fast!);终止进程,略过接下来的任何try/finally块或者finalizersenvironment. faiifast(except!on. message);3, /*断路器跳闸前的最大阈值*/ timespan. fromseconds (2) ; /* time to wait between each try before attempting to trip the circuit breaker */public void dostuff()var exterrmlservice 二 getconnection(); external ser
8、vice. dostuff();connectiondependency getconnection()try var newconnection 二 new connectiondependency(); circuitbreaker. reset();return newconnection;catch (exception exception) circuitbreaker. trip(exception); throw;断路器模式简单实现 using system;using system. threading;public class circuitbreaker public ci
9、rcuitbrcakcr(string nanic, /*操作名称*/action<exception> tripaction, /* 一旦断路器跳闸 action 就会被调 用*/int maxtimestoretry, /*断路器跳闸前重试的吋间*/timespan delaybetweenretries /*每一次重试的时间间隔*/)this, name = name;this. tripaction = tripaction;this. maxtimestoretry 二 maxtimestoretry;this. delaybetweenretries = delaybe
10、tweenretries;/ 一旦用户迫使断路器跳闸,计时器就会开启timer = new timer(circuitbreakertripped, null, timeout. infinite, (int)delaybetweenretries. totalmilliseconds);public void reset()var oldvalue 二 interlocked.exchange(ref failurecount, 0);timer. change(timeout. tnfini te, timeout. tnfini te);console. writclinc("
11、the circuit breaker for 0 is now disarmed,z, name);ipublic void trip (exception ex) lastexception = ex;var newvalue 二 interlocked. increment(ref failurecount);if (ncwvalue 二二 1)/开启重试计时器. timer. change(delaybetweenretries,timespan. frommi 11 iseconds (t);/记录已触发的断路器.console. writeline (z/the circuit b
12、reaker for 0 is now in the armed state", name);void circuitbreakertripped(object state)console. writclinc ("check to see if we need to trip the circuit breaker. retry: 0failurecount);if (interlocked. increment(ref failurecount) > maxtimestoretry) console. wri teline(z/the circui t break
13、er for 0 is now tripped. calling specified action", namc);tripaction(lastexception);return;timer. change(delaybetweenretries, timcspan. frommilliscconds (t);readonly string name;readonly int maxtimestoretry;long failurccount;readonly actionexception> tripaction;exception lastexception;readon
14、ly timespan delaybetweenretries;readonly timer timer;断路器单元测试testfixturepublic class circuitbreakerteststestpublic voidwhen the circuit breaker is tripped the trip action is called after r eaching_max_threshol d()""bool circuitbreakertripactioncalled = false;var connectionexception 二 new ex
15、ception (something bad happened. );var circuitbrcaker 二 newcircuitbreaker("checkserviceconnection", exception =>console. writeline (/zcircuit breaker tripped - fail fast'o ; circuitbreakertripactioncalied 二 true;/ you would normal 1y fai1 fast here in the action to faciliate the pro
16、cess shutdown by calling:/ environment. failfast(connectionexception. message);, 3, timespan. fromseconds(1);circuitbreaker. trip(connectionexception);system threading thread.sleep (5000);assert istrue(circuitbreakertripactioncalled);testpublic voidwhen_the_circuit_breaker_is_reset_the_trip_action_i
17、s_not_called()7""""""bool circuitbreakertripactioncalied 二 false; var connectionexception 二 new except!on("something bad happencd. );var circuitbreaker = newcircuitbreaker("checkserviceconnection, exception 二console. writclinc("circuit breaker tripped - f
18、ail fast"); circuitbreakertripactioncalled = true;/ you would normally fail fast here in the action to faciliate the process shutdown by calling:/ environment. faiifast(connectionexcept!on. message);, 3, timcspan. fromseconds(2);circuitbreaker. trip(connectionexception);system. threading. thread. sleep(looo); circuitbreaker. reset ();assert. faise(circui tbreakertripactioncal 1ed);上面代码案例采用console. writeline,你可以选择口己喜欢的logger。最丿匸结语 断路器是现代社会重要的组成
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加盟合作协议书!2024年
- 建筑工程施工意外保险合同
- 艺术品创作委托协议
- 课课程设计java图书管理
- 摩托车转让合同样本
- 大学生就业合同协议书格式
- 房屋反担保抵押合同2024年
- 个人林业机械租赁合同
- 租房协议终止:提前解约租房协议书模板
- 2024年公司间合作协议范本
- 2024年深圳市中考英语试题及解析版
- 高职护理专业《外科护理技术》说课稿
- 信息化系统安全运维服务方案三篇
- 全国职业院校技能大赛高职组(化工生产技术赛项)省选拔赛考试题库(含答案)
- 《药品生产监督管理办法》知识考试题库及答案
- 通信工程专业导论(第6-10章)
- 幼教培训课件:《幼儿园如何有效组织幼儿户外自主游戏》
- Unit 1 (Section A 1a-2) 教学设计 2024-2025学年人教版(2024)七年级英语上册
- 17《爬天都峰》第一课时 公开课一等奖创新教学设计
- 特朗普培训课件
- Kubernetes 持久化存储方案选择-从入门到评估
评论
0/150
提交评论