系统在现实世界中会面临各种问题,包括错误的接线、极端的气温、船舶在恶劣天气中上下颠簸时低质量的用户数据输入等。这些会带来巨大的代价,项目延期、远离家人等。混沌工程的一项高级原则是在实验中引入现实世界的事件。
简单系统仅是冰山一角,由软件、硬件、抽象和服务提供商所组成的所有这些附加层次,都是影响我们所关注的系统行为的全局的一部分。许多现实世界所暴露出的事情之前是无法预料的。在设计和构建软件时,要深思熟虑地考虑接口、组件契约和服务等级协议,这已经是一项复杂的任务。考虑依赖链时,情况更加复杂。我们系统所依赖的一个个黑匣子组件,都会出现影响执行方式的状况,硬件故障、软件缺陷、被错误记录的程序、天灾人祸等。
当为生产系统交付混沌工程方案时,会遇到以下几种情况: 已知事件与预期后果、已知事件与意外后果、未知事件与意外后果。
软件更新可能出错的一些情况: 服务的版本存在错误,必须回滚或修复。服务存在缺陷,并且破坏了数据的持久状态,因此无法回滚以进入上一个已知的正确状态,部署过程因故中断,造成服务的新版本无法部署。部署过程因故中断,但在中断前存在问题的服务的新版本的部署速度过快,导致故障切换成本过高。以确状态情况的任意组合。
可以从三个角度定义故障优先级:事件发生的频率有多高?优雅地处理该事件的可能性有多大?事件发生的可能性有多大?上述问题的答案应基于产品或服务的业务需求。业务需求的可靠性目标的满足程度应与客户设定的期望相匹配。
考虑整个服务依赖链中预期的事件、耐受度以及即将到来的偶发威胁。对依赖进行威胁建模。要考虑每次故障都可能受多个依赖项的影响,依赖之间又互相依赖。
在设计混沌工程系统,并在孤立性故障、组合性故障和传递性故障之间进行选择时,使用为服务和依赖选择实验场景时所使用的优先级排序方法。一旦在解决单独依赖项方面取得进展,就可以开始考虑整个系统的运动,实验内部和外部每个运动部分的执行效果各不相同,并且会随机出现故障。
从小处着手,并将爆炸半径控制到最小。记住优先级,从执行最高优先级的实验开始。为紧急情况准备好行动预案。你所做的就是真实发生的事情,你只不过加快了这些事件的自然进程,以消除意外。对正确的事件进行优先级排序能让产品的混沌工程实践更加实用。