测试是保障代码质量的基本手段,但”稳定性”这个目标远不是测试能完全覆盖的。单元测试验证的是函数级别的正确性,集成测试验证的是模块间的协作,但生产环境的故障往往来自这些测试触及不到的地方——网络抖动、磁盘写满、依赖方超时、流量突增。
更深层的问题是,测试验证的是”已知的已知”——你写了测试用例,意味着你已经预见到了这种场景。但真正导致线上事故的,往往是那些”未知的未知”。100% 的代码覆盖率不等于 100% 的故障免疫,这个认知是稳定性建设的起点。
根据 Google SRE 的数据,约 70% 的生产故障与变更直接相关。这里的”变更”不仅包括代码发布,还包括配置变更、基础设施变更、数据迁移等一切改变系统状态的操作。既然变更是故障的最大来源,那么变更管控就是稳定性保障的第一道防线。
有效的变更管控不是”禁止变更”,而是让变更可控、可观测、可回滚。我们建立的变更管控体系包含几个核心要素:变更窗口管理(避免在业务高峰期发布)、灰度发布(先 1%、再 10%、再全量)、自动化回滚(发布后关键指标异常自动回退)、变更关联分析(出问题时快速定位最近的变更)。
混沌工程的核心理念是”在可控的范围内主动注入故障,验证系统的韧性”。与其等着线上出故障再被动应对,不如主动去发现系统的薄弱环节。Netflix 的 Chaos Monkey 是最知名的实践——随机终止生产环境的服务实例,验证系统是否能自动恢复。
我们在实践混沌工程时遵循几个原则:从非核心链路开始,先在预发环境验证,建立完善的熔断机制确保实验失控时能立即停止。混沌工程不是”搞破坏”,而是一种严谨的工程实验方法。每次实验前要有明确的假设,实验后要有详细的分析报告和改进措施。