一个系统的复杂性往往是无法预知的,而且这种状态是很难琢磨,因为任何的系统总是在确定性的状态下存在一种不可预知的非确定性,这样的案例可以说是有很多的,比如XX城市的X系统由于网络故障导致系统不可用,可以说这样的案例太多。所以针对每个系统而言都是存在稳定状态和不稳定状态,很说明确的说混沌与不确定性是一回事。其实在系统的边界而言,或者是从系统最初设计以及保障角度而言,混沌状态它首先代表的是系统是处于一个稳定性的状态,只是系统在运行的过程中由于局部技术问题以及可能存在的全局技术问题导致系统出现不稳定的状态,虽然我们很清楚这种现状是客观存在并且可能是无法改变的,但是作为技术团队,需要站在系统的高可用,可靠性,稳定性等等角度,需要最大寻求系统的确定性以及让系统的运行始终在可以掌控的范围内。混沌工程的核心需要解决的是模拟现实中可能会出现的不可预知的情况以及本身客观存在的情况,比如网络故障,云服务器大面积出现瘫痪等情况了,那么在这种情况发生后,如何能够使用成熟的技术方案保障产品的可用性以及保存数据的完整性,而不至于在现实中真的出现该问题的时候表现的束手无策。
所以首先需要明确的是混沌工程的思想它是科学实验的方法论,所有的一切都是在系统实验的基础上来寻求系统的平衡性。它的具体定义是:“混沌工程是一门在系统上进行实验的科学,目的是建立系统抵御生产环境中失控情况的能力以及信心”。所以在公司如果需要开展混沌工程,需要遵守混沌工程的五大原则,这些原则具体为:
混沌实验有非常成熟的工具,比如阿里巴巴开源的ChaosBlade,在前面的文章中详细地介绍了混沌实验模拟网络层故障,系统CPU,内存,OOM等案例,这里就不再重复。本质上是通过工具的方式来模拟系统在出现故障的情况下,如何能够和研发团队针对这种情况制定合理的解决方案,这样如果在真实的生产环境中出现了该问题,因为之前已经是预知到了该错误,而且有应对的解决方案,那么可以很快速的针对该问题进行解决,这样的目的以及好处是不会在使用用户的客户造成影响。通过混沌工程的实践方式,也是能够寻找出系统中可能设计不合理的地方,然后针对这些地方来进行具体的调整和程序的优化,当然它是一个持续推进的过程,很难说一步到位。只不过在测试的立场上而言,需要在服务端稳定性的角度而言,需要思考的是当被运行的系统出现网络故障,OOM,数据库调用延迟,Redis调用延迟,程序假死等情况下,除了报警的机制,是否还有另外一套机制来应对这些突发的情况,这些情况都是需要考虑在测试的风险之内并且有具体的场景说明,比如一个内存泄露的程序是无法提供它的基本业务保障功能的,其他异常情况也是,比如网络故障导致客户端调用服务端迟迟得不到服务端的响应导致客户端一直在加载的状态。