与"稳定性"的区别
稳定性/可靠性(Reliability):系统在预期条件下持续正常工作的能力。
韧性(Resilience):系统在意外条件下——组件失效、流量激增、依赖故障、人为错误——维持核心功能并恢复的能力。
类比:
- 稳定性是"不容易坏";
- 韧性是"坏了也能撑住,还能快速恢复"。
关键洞察:复杂系统的失效是不可避免的。因此,除了"减少失效"(稳定性),还需要"在失效中生存"(韧性)。
韧性的四个支柱
一、冗余(Redundancy)
没有单点故障:
- 多实例、多可用区、多地域;
- 数据的多副本;
- 网络的多路径。
注意:冗余不等于韧性——冗余组件必须在需要时真的能用(需要故障转移机制 + 定期验证)。
一个"从没被测试过的备份实例",其价值接近于零。
二、隔离(Isolation)
防止故障扩散:
- 舱壁模式(Bulkhead):像船的隔水舱——一个舱进水不会沉船。在系统里表现为资源隔离(线程池隔离、连接池隔离、按租户隔离);
- 熔断(Circuit Breaker):下游故障时快速失败,而不是等待超时耗尽资源;
- 限流(前文提到过);
- 网络分段(前文提到过)。
三、优雅降级(Graceful Degradation)
核心功能优先。
当某些依赖不可用时:
- 关闭非核心功能(如推荐、评论、个性化);
- 用缓存的、陈旧的数据(而非报错);
- 返回简化的响应。
例子:电商大促时,可以暂时关闭"推荐"和"评价"功能,保证"浏览—加购—下单—支付"主链路可用。
这需要预先设计——明确定义哪些是核心功能,哪些可以牺牲。这是产品决策,不只是技术决策。
四、快速恢复(Recovery)
- 自动化故障转移;
- 快速回滚(前文提到过);
- 幂等性和重试(前文提到过);
- 状态的可重建性(无状态服务 + 外部化状态)。
韧性工程的人文视角
这个领域有一个重要的认识转变:韧性不只是技术属性,也是组织和人的属性。
关键观点:
系统在日常运行中之所以不崩溃,很大程度上依赖人(运维、开发)的持续适应和调整——他们填补了设计和现实之间的缝隙。
因此,韧性工程关注:
一、人如何处理意外
一线工程师在面对从没见过的情况时,是如何判断和应对的?他们依赖什么信息?有什么工具?
二、让系统的边界可见
好的系统能让操作者知道:
- 当前状态是什么;
- 我做的操作会有什么后果;
- 系统正在接近什么极限。
可观测性(前文提到过)在这里不只是"技术监控",而是"让人的判断成为可能"。
三、从成功中学习,而不只从失败中学习
传统的事故分析只看失败。韧性工程认为:日常的成功同样值得研究——因为成功的背后往往有人员的临场调整,而这些调整正是系统韧性的来源。
适应力(Adaptive Capacity)
一个核心概念:组织在面对未曾预料的情况时,调整自身以适应的能力。
如何增强:
- 决策权的下放:一线人员有权在紧急情况下做决定(如是否立即回滚、是否降级);
- 人员的多样性和经验:不同视角能识别出更多可能性;
- 演练和心理准备:模拟意外情境,让人熟悉"不确定性中的决策";
- 信息的流通:让需要决策的人能获得完整信息。
与 SRE 的关系
SRE(站点可靠性工程)提供了大量韧性工程的技术实践:SLO、错误预算、混沌工程、无指责复盘。
韧性工程则提供了理解这些实践为什么有效的框架——把系统视为技术 + 人 + 组织的复合体。
一句话
韧性工程的核心认识是:你无法预见所有故障,所以你应该建设一个"在意外发生时仍能运作"的系统和组织——而不只是一个"设计上不会失败"的系统。
说明:本文为可靠性工程的知识整理。