系统的健壮性设计(四)
面向失败设计
世界上没有完美的东西,系统也一样,不论想的如何完美还是可能出现意料之外的bug。所以需要设计者预先就考虑出现失败的情况处理,不管是对业务或功能(功能的性能、功能的容量、功能的稳定性)都需要。面向失败的设计,就是以“失败”为对象,天然为了失败而存在的设计思想。
在软件生命周期中,会出现各式各样的问题,我们可通过面向失败设计,防范和监控已知的确定性风险及未知的不确定性风险:
- 任何环境都是不可信赖的;
- 任何外部依赖接口都可能出错的;
- 任何异常都需要响应和处理的;
- 任何行为都需要日志记录的;
- 任何系统的上线都需要严酷的测试
测试健壮性
- 功能测试:想象用户的一切可能行为进行正确性验证
- 稳定性测试:确定系统长时间在正常压力情况下运行的有效性
- 性能测试:系统能够提供的最大服务级别的能力
- 混沌工程:确定线上系统故障的恢复能力
分支覆盖
- 代码覆盖率
- 条件判定覆盖,特别是条件组合上效果
- 路径覆盖,==每条可能的路径(排列组合)都包含了
混沌工程
混沌工程(Chaos Engineering), 是在分布式系统上进行实验的学科,是一种未雨绸缪的心态。由薄弱的环节上,做到自我发现。特点是放置一个炸弹进去,控制爆炸半径,评估损伤和自我修复能力。
Netflix 提出Chaos Monkey
混沌工程是识别业务系统的稳定性指标,并建立观测(监控)体系
混沌原则
开发混沌工程实验时,可遵循以下原则:
- 建立稳定状态的假设;
- 持续自动化运行实验。业务系统在持续变化,演练也需要例行化、自动化。
- 多样化实现世界事件;
- 最小化“爆炸半径”:
- 按照影响从小到大进行演练;
- 控制演练业务的故障半径(爆炸半径),防止从演练转化为线上事故。
- 在生产环境运行实验:
- 最终要在生产环境中演练,这才是最真实的结果;
- 但可以从非在线开始,逐步进行线上环境。