概述
传统的可靠性保障思路是"尽量不出故障"——加监控、加告警、加冗余。但这种被动防御有一个根本缺陷:你不知道系统在故障发生时的真实表现,直到故障真正发生。
混沌工程反其道而行之:主动、可控地注入故障,在故障变成事故之前发现系统的弱点。 它不是搞破坏,而是一种科学的实验方法——提出假设(“系统应该能承受某节点故障”),设计实验(杀掉一个节点),验证假设(服务是否仍然正常),发现弱点(如果服务异常了)。
Netflix 的 Chaos Monkey 开创了这一领域,如今混沌工程已经成为 SRE 体系的重要组成部分。从原理、实验设计、爆炸半径控制、Kubernetes 实战到常态化实践,详细梳理如何把混沌工程从"概念"落地为"日常实践"。
关于混沌工程的原则,可参考 Principles of Chaos Engineering 和 Chaos Engineering Book。
一、混沌工程的原理
核心思想
混沌工程的核心思想是:
在正常流量期间,通过有意注入故障来验证系统的弹性,从而在故障变成事故之前发现并修复弱点。
这与传统的测试有本质区别:
| 维度 | 传统测试 | 混沌工程 |
|---|---|---|
| 目标 | 验证"代码是否正确" | 验证"系统是否能承受故障" |
| 环境 | 测试环境 | 生产环境(或接近生产的预发环境) |
| 故障来源 | 预定义的测试用例 | 真实模拟的故障场景 |
| 发现时机 | 开发阶段 | 运行阶段 |
| 关注点 | 功能正确性 | 系统弹性 |
为什么要在生产环境做
混沌工程最反直觉的一点是"在生产环境注入故障"。为什么不 在测试环境做?
- 测试环境无法复制生产的复杂性:生产环境的流量模式、数据量、网络拓扑、依赖关系与测试环境完全不同
- 测试环境的故障不会造成真实影响:没有压力,就不会暴露在压力下才出现的问题
- 只有在生产环境才能验证完整的恢复链路:告警是否触发?On-Call 是否响应?自动恢复是否生效?
当然,直接在生产环境做混沌实验需要严格的控制——这正是"爆炸半径控制"要解决的问题。
混沌工程的四条原则
根据 Principles of Chaos Engineering,混沌工程遵循以下原则:
- 围绕稳态行为定义"正常":先定义系统的正常状态(SLI/SLO),再注入故障看是否偏离
- 假设稳态在对照组和实验组中都保持:一部分流量/节点不注入故障(对照组),一部分注入(实验组),对比差异
- 在真实环境中实验:生产环境或接近生产的环境
- 自动化持续运行:不是一次性实验,而是持续自动化运行
混沌工程的收益
chaos_engineering_benefits:
direct_benefits:
- "提前发现系统弱点和单点故障"
- "验证告警和恢复机制是否有效"
- "提升团队对故障的响应能力"
- "验证架构设计假设是否成立"
indirect_benefits:
- "建立团队对系统弹性的信心"
- "驱动架构改进(从'看起来能扛'到'验证过能扛')"
- "减少真实故障的 MTTR(因为已经演练过类似场景)"
- "培养'故障不可避免'的工程文化"
二、从 Chaos Monkey 说起
Netflix 的混沌工程演进
Netflix 是混沌工程的开创者,其演进路径值得参考:
| 阶段 | 工具 | 做什么 | 时间 |
|---|---|---|---|
| Chaos Monkey | 随机杀实例 | 验证服务能容忍单实例故障 | 2011 |
| Latency Monkey | 注入网络延迟 | 验证服务对延迟的容忍度 | 2011-2014 |
| Conformity Monkey | 检查合规性 | 发现不符合好的实践的实例 | 2011-2014 |
| Chaos Gorilla | 模拟可用区故障 | 验证跨可用区容灾能力 | 2014-2015 |
| Chaos Kong | 模拟区域故障 | 验证跨区域故障转移 | 2015 |
| Chaos Automation Platform (ChAP) | 自动化实验平台 | 自动选择实验、执行、分析 | 2016+ |
Chaos Monkey 的启示
Chaos Monkey 的核心逻辑极其简单——在工作时间随机杀掉生产环境的一个实例:
# Chaos Monkey 简化逻辑
import random
import schedule
def chaos_monkey():
instances = get_all_production_instances()
victim = random.choice(instances)
log.info(f"Chaos Monkey terminating: {victim}")
terminate_instance(victim)
# 等待并观察
time.sleep(300) # 5 分钟
# 验证服务是否正常
if check_service_health():
log.info(f"Service survived termination of {victim}")
else:
log.error(f"Service degraded after terminating {victim}")
alert_oncall(f"Chaos Monkey found weakness: {victim} is critical")
# 工作时间每小时执行一次
schedule.every().hour.at(":00").do(chaos_monkey)
但就是这么简单的工具,在早期发现了大量问题:
- 有服务没有配置健康检查,实例死了也没人知道
- 有服务没有自动重启机制,实例被杀后无法自动恢复
- 有服务有单点依赖,一个实例死了整个服务不可用
- 有服务的负载均衡没有及时摘除死实例
Chaos Monkey 的价值不在于杀实例,而在于暴露"你以为能扛但实际上扛不住"的弱点。
三、实验设计方法
混沌实验的组成要素
一个完整的混沌实验需要包含以下要素:
# 混沌实验定义模板
experiment:
name: "支付服务单 Pod 故障容忍验证"
# 1. 稳态假设(什么算"正常")
steady_state_hypothesis:
sli: "支付 API 成功率"
normal_state: "> 99.9%"
sli_source: "Prometheus"
# 2. 实验范围
scope:
environment: "production" # 生产环境
service: "payment-service"
namespace: "production"
# 3. 故障注入
fault:
type: "pod_kill" # 杀掉 Pod
target: "random" # 随机选择
count: 1 # 杀 1 个
# 4. 爆炸半径控制
blast_radius:
strategy: "percentage" # 按比例
percentage: 10 # 只影响 10% 的实例
fallback: "auto_abort" # SLI 恶化超阈值自动中止
# 5. 持续时间
duration: "5m"
# 6. 回滚方案
rollback:
action: "kubernetes_auto_heal" # K8s 自动重建 Pod
manual_rollback: "kubectl rollout restart deployment/payment-service"
# 7. 成功/失败标准
success_criteria: "SLI 在实验期间保持 > 99.9%"
failure_action: "记录弱点,创建改进工单"
实验设计流程
Step 1: 确定实验目标
→ "验证支付服务能容忍单个 Pod 故障"
Step 2: 定义稳态假设
→ "在 Pod 故障期间,支付 API 成功率 > 99.9%,P99 延迟 < 500ms"
Step 3: 选择故障类型
→ "杀掉 1 个 payment-service 的 Pod"
Step 4: 确定爆炸半径
→ "从 1 个 Pod 开始,payment-service 有 10 个 Pod,影响 10%"
Step 5: 设定中止条件
→ "成功率 < 99.5% 或 P99 > 1s 时自动中止实验"
Step 6: 准备回滚方案
→ "K8s 自动重建 Pod;如果未恢复,手动 rollout restart"
Step 7: 执行实验
→ 注入故障 → 持续监控 SLI → 验证假设
Step 8: 分析结果
→ 稳态保持 → 假设成立 → 系统有弹性 ✅
→ 稳态被破坏 → 假设不成立 → 发现弱点 🔍
故障类型分类
混沌工程可以注入的故障类型覆盖了系统的各个层面:
| 层面 | 故障类型 | 模拟场景 | 工具 |
|---|---|---|---|
| 基础设施 | 节器宕机 | 物理机故障 | Chaos Mesh, AWS Fault Injection |
| 网络 | 网络延迟 | 跨区域网络劣化 | tc, Chaos Mesh |
| 网络 | 网络丢包 | 网络不稳定 | tc, Chaos Mesh |
| 网络 | 网络分区 | 可用区隔离 | Chaos Mesh |
| 计算 | Pod 杀死 | 进程崩溃 | Chaos Monkey, Chaos Mesh |
| 计算 | CPU 满载 | CPU 竞争 | stress-ng, Chaos Mesh |
| 计算 | 内存耗尽 | 内存泄漏 | Chaos Mesh |
| 磁盘 | 磁盘满 | 日志撑满磁盘 | Chaos Mesh |
| 磁盘 | IO 延迟 | 存储性能劣化 | Chaos Mesh |
| 应用 | 依赖延迟 | 下游服务慢 | Chaos Mesh, Litmus |
| 应用 | 依赖不可用 | 下游服务宕机 | Chaos Mesh |
| DNS | DNS 解析失败 | DNS 故障 | Chaos Mesh |
实验优先级排序
不是所有实验都值得同时做。建议按以下优先级排序:
优先级 1:高频故障场景
→ Pod 崩溃、网络延迟、磁盘满
→ 这些是最常发生的故障,验证弹性优先级最高
优先级 2:核心依赖故障
→ 数据库不可用、缓存不可用、消息队列不可用
→ 验证降级和故障转移机制
优先级 3:区域性故障
→ 可用区隔离、区域不可用
→ 验证多活/容灾能力
优先级 4:组合故障
→ 同时注入多种故障
→ 验证极端场景下的系统行为
四、爆炸半径控制
为什么爆炸半径控制是关键
混沌工程在生产环境注入故障,最大的风险是"实验变成了真实故障"。爆炸半径控制就是这个安全阀——确保即使实验出了问题,影响也是可控的。
控制策略
爆炸半径控制策略(从小到大):
Level 1: 单实例
→ 只注入 1 个实例的故障
→ 最小影响,适合初次实验
Level 2: 百分比实例
→ 注入 5-10% 的实例故障
→ 验证负载均衡和自动恢复
Level 3: 单可用区
→ 模拟整个可用区不可用
→ 验证跨可用区容灾
Level 4: 跨可用区
→ 模拟多可用区同时故障
→ 验证区域级容灾(高风险)
自动中止机制
# 自动中止机制
auto_abort:
enabled: true
# 监控的 SLI
monitors:
- metric: "payment_api_success_rate"
threshold: 99.5% # 低于此值自动中止
window: "1m"
- metric: "payment_api_p99_latency"
threshold: 1000ms # 超过此值自动中止
window: "1m"
- metric: "error_rate"
threshold: 5% # 错误率超标自动中止
window: "30s"
# 中止动作
abort_actions:
- "立即撤销故障注入"
- "通知 On-Call 工程师"
- "记录实验中止原因"
- "如果服务未自动恢复,执行回滚"
# 自动中止实现
class ChaosExperiment:
def __init__(self, config):
self.config = config
self.aborted = False
def run(self):
# 1. 记录实验前的稳态基线
baseline = self.get_current_sli()
log.info(f"Baseline SLI: {baseline}")
# 2. 注入故障
self.inject_fault()
log.info("Fault injected, monitoring...")
# 3. 持续监控
start_time = time.time()
while time.time() - start_time < self.config.duration:
current_sli = self.get_current_sli()
if self.should_abort(current_sli):
self.abort()
return
time.sleep(10) # 每 10 秒检查一次
# 4. 实验正常结束,撤销故障
self.revoke_fault()
# 5. 验证恢复
time.sleep(60)
if not self.is_recovered():
self.emergency_rollback()
def should_abort(self, current_sli):
for monitor in self.config.monitors:
if current_sli[monitor['metric']] > monitor['threshold']:
log.error(f"Abort condition met: {monitor['metric']} = "
f"{current_sli[monitor['metric']]} > {monitor['threshold']}")
return True
return False
def abort(self):
self.aborted = True
self.revoke_fault()
notify_oncall(f"Chaos experiment aborted: SLI exceeded threshold")
log.error("Experiment aborted due to SLI violation")
实验时间窗口
# 实验时间窗口选择
experiment_schedule:
preferred_window:
time: "工作日 10:00-16:00"
reason: "团队在线,能快速响应意外"
avoid:
- "非工作时间(夜间/周末)"
- "业务高峰期(如电商大促期间)"
- "有计划维护窗口的时间"
- "有重要发布的当天"
frequency:
initial: "每周 1 次,小爆炸半径"
mature: "每天自动运行,常规实验"
五、Kubernetes 上的混沌实验
Chaos Mesh 简介
Chaos Mesh 是 PingCAP 开源的 Kubernetes 原生混沌工程平台,是目前 Kubernetes 生态中最成熟的混沌工程工具。
Chaos Mesh 的核心特性:
- Kubernetes 原生:使用 CRD(Custom Resource Definition)定义混沌实验
- 丰富的故障类型:Pod Kill、网络延迟/丢包/分区、CPU/内存压力、磁盘 IO、DNS 等
- 精确的爆炸半径控制:按 namespace、label selector、百分比选择目标
- 可视化 Dashboard:Web 界面管理和监控实验
安装 Chaos Mesh
# 使用 Helm 安装 Chaos Mesh
helm repo add chaos-mesh https://charts.chaos-mesh.org
helm install chaos-mesh chaos-mesh/chaos-mesh \
-n chaos-testing \
--set chaosDaemon.runtime=containerd \
--create-namespace
# 验证安装
kubectl get pods -n chaos-testing
常见混沌实验示例
实验 1:Pod Kill — 验证服务能容忍 Pod 故障
# pod-kill-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: payment-pod-kill
namespace: chaos-testing
spec:
action: pod-kill # 杀掉 Pod
mode: one # 只杀一个
selector:
namespaces:
- production
labelSelectors:
"app": "payment-service"
scheduler:
cron: "@every 1h" # 每小时执行一次
实验 2:网络延迟 — 验证服务对延迟的容忍度
# network-delay-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: payment-network-delay
namespace: chaos-testing
spec:
action: delay # 注入延迟
mode: all
selector:
namespaces:
- production
labelSelectors:
"app": "payment-service"
delay:
latency: "200ms" # 200ms 延迟
correlation: "0"
jitter: "50ms" # 50ms 抖动
duration: "5m" # 持续 5 分钟
scheduler:
cron: "@every 24h"
实验 3:网络分区 — 模拟服务间通信中断
# network-partition-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: payment-db-partition
namespace: chaos-testing
spec:
action: partition # 网络分区
mode: all
selector:
namespaces:
- production
labelSelectors:
"app": "payment-service"
direction: to # payment → db 方向阻断
target:
selector:
namespaces:
- production
labelSelectors:
"app": "postgres"
mode: all
duration: "2m"
实验 4:CPU 压力 — 模拟 CPU 竞争
# cpu-stress-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: StressChaos
metadata:
name: payment-cpu-stress
namespace: chaos-testing
spec:
mode: one
selector:
namespaces:
- production
labelSelectors:
"app": "payment-service"
stressors:
cpu:
workers: 2 # 2 个 CPU 压力 worker
load: 80 # 80% 负载
duration: "3m"
实验 5:磁盘 IO 延迟 — 模拟存储性能劣化
# disk-io-delay-experiment.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: IOChaos
metadata:
name: payment-disk-io-delay
namespace: chaos-testing
spec:
action: latency
mode: one
selector:
namespaces:
- production
labelSelectors:
"app": "payment-service"
volumePath: "/data"
path: "/data/**/*" # 影响的数据路径
delay: "100ms" # IO 延迟 100ms
percent: 50 # 50% 的 IO 受影响
duration: "5m"
实验编排:多步实验
实际场景中,一个混沌实验可能需要多个步骤——先注入故障,等待一段时间,再注入第二个故障:
# 串行编排:先杀 Pod,再注入网络延迟
apiVersion: chaos-mesh.org/v1alpha1
kind: Workflow
metadata:
name: payment-resilience-test
namespace: chaos-testing
spec:
entry: serial
workflow:
- template:
name: phase-1-pod-kill
templateType: PodChaos
deadline: 2m
podChaos:
action: pod-kill
mode: one
selector:
namespaces: [production]
labelSelectors:
"app": "payment-service"
- template:
name: phase-2-network-delay
templateType: NetworkChaos
deadline: 5m
networkChaos:
action: delay
mode: all
selector:
namespaces: [production]
labelSelectors:
"app": "payment-service"
delay:
latency: "200ms"
jitter: "50ms"
- template:
name: phase-3-stress
templateType: StressChaos
deadline: 3m
stressChaos:
mode: one
selector:
namespaces: [production]
labelSelectors:
"app": "payment-service"
stressors:
cpu:
workers: 2
load: 90
结合 Prometheus 自动验证
# 使用 Chaos Mesh 的 Workflow + Prometheus 验证
apiVersion: chaos-mesh.org/v1alpha1
kind: Workflow
metadata:
name: payment-chaos-with-validation
namespace: chaos-testing
spec:
entry: serial
workflow:
# 1. 记录实验前基线
- template:
name: record-baseline
templateType: Task
task:
container:
image: curlimages/curl
command:
- /bin/sh
- -c
- |
echo "Recording baseline..."
curl -s "http://prometheus:9090/api/v1/query?query=rate(http_requests_total{status!~\"5..\"}[1m])" > /tmp/baseline.json
# 2. 注入故障
- template:
name: inject-fault
templateType: NetworkChaos
deadline: 5m
networkChaos:
action: delay
mode: all
selector:
namespaces: [production]
labelSelectors:
"app": "payment-service"
delay:
latency: "500ms"
# 3. 验证 SLI
- template:
name: validate-sli
templateType: Task
task:
container:
image: curlimages/curl
command:
- /bin/sh
- -c
- |
echo "Validating SLI..."
ERROR_RATE=$(curl -s "http://prometheus:9090/api/v1/query?query=sum(rate(http_requests_total{status=~\"5..\"}[1m]))/sum(rate(http_requests_total[1m]))" | jq -r '.data.result[0].value[1]')
echo "Current error rate: $ERROR_RATE"
if (( $(echo "$ERROR_RATE > 0.01" | bc -l) )); then
echo "SLI violated! Error rate too high."
exit 1
fi
echo "SLI OK"
六、实验结果分析
什么算"实验成功"
混沌实验的"成功"有两种含义,需要区分:
| 实验结果 | 含义 | 后续行动 |
|---|---|---|
| 稳态保持 | 系统在故障下依然正常 | 扩大爆炸半径或增加故障强度 |
| 稳态被破坏 | 系统在故障下出现问题 | 分析原因,修复弱点,重新实验 |
关键认知:发现弱点不是实验失败,而是实验的价值所在。 混沌工程的目的就是发现弱点——如果所有实验都"稳态保持",要么系统真的很强,要么实验设计得太温和了。
弱点分类与处理
# 弱点分类与处理策略
weakness_categories:
architecture:
description: "架构设计缺陷"
examples:
- "单点故障:某个 Pod 死了整个服务不可用"
- "无冗余:数据库没有从库"
action: "架构改造,增加冗余"
priority: "P0"
configuration:
description: "配置不当"
examples:
- "健康检查配置错误:Pod 死了 K8s 没发现"
- "没有配置 PDB(Pod Disruption Budget)"
action: "修正配置"
priority: "P0"
monitoring:
description: "监控盲区"
examples:
- "故障发生了但告警没触发"
- "告警触发了但定位信息不足"
action: "补充监控和告警"
priority: "P1"
recovery:
description: "恢复机制不足"
examples:
- "Pod 被杀后没有自动重启"
- "自动扩容没有生效"
action: "完善自动化恢复"
priority: "P1"
process:
description: "流程缺陷"
examples:
- "Runbook 缺失,排查时不知道该做什么"
- "escalation 不清晰,不知道该找谁"
action: "完善流程和文档"
priority: "P2"
弱点跟踪
# 混沌实验发现的弱点跟踪
## 实验:支付服务 Pod Kill
**日期**:2026-07-10
**结果**:稳态被破坏
### 发现的弱点
| # | 弱点 | 类型 | 影响 | 优先级 | 状态 |
|---|------|------|------|--------|------|
| 1 | payment-service 只有 2 个 Pod,杀 1 个后 P99 延迟翻倍 | 配置 | P99 从 200ms 到 500ms | P0 | 已修复(扩到 5 个 Pod) |
| 2 | Pod 被杀后负载均衡 30 秒后才摘除流量 | 配置 | 30 秒内请求发到死 Pod | P1 | 已修复(调短健康检查间隔) |
| 3 | 告警在 Pod 重启后才触发,不够及时 | 监控 | 延迟告警 30 秒 | P2 | 待修复 |
### 改进项
- [x] 扩大 payment-service 副本数到 5
- [x] 调整健康检查:liveness probe 间隔从 10s 调到 5s
- [ ] 增加 Pod 重启告警,阈值从 3 次/小时调到 1 次/小时
七、从演练到常态
成熟度模型
混沌工程的落地是一个渐进过程:
| 阶段 | 特征 | 做法 | 频率 |
|---|---|---|---|
| L1 认知 | 了解概念,未实践 | 学习和评估 | - |
| L2 试点 | 在测试环境手动实验 | 选择 1-2 个非核心服务做实验 | 每月 1 次 |
| L3 生产试点 | 在生产环境小范围实验 | 选择 1 个核心服务,小爆炸半径 | 每周 1 次 |
| L4 自动化 | 自动化实验平台 | 自动选择目标、执行、验证 | 每天 |
| L5 常态化 | 混沌实验融入 CI/CD | 每次发布前自动做弹性验证 | 持续 |
推进路径
Phase 1: 试点(1-2 个月)
→ 选择非核心服务在测试环境做实验
→ 目标:熟悉工具,建立流程
→ 产出:实验模板、操作手册
Phase 2: 生产小范围(2-3 个月)
→ 选择 1 个核心服务在生产做实验
→ 从最小爆炸半径开始(1 个 Pod)
→ 目标:验证生产环境的安全性
→ 产出:爆炸半径控制方案、自动中止机制
Phase 3: 扩大范围(3-6 个月)
→ 覆盖所有核心服务
→ 增加故障类型(网络、磁盘、CPU)
→ 目标:发现并修复主要弱点
→ 产出:弱点清单和修复计划
Phase 4: 自动化(6-12 个月)
→ 建设自动化实验平台
→ 实验自动调度、执行、验证、报告
→ 目标:持续运行,而非一次性
→ 产出:自动化混沌平台
Phase 5: 常态化(12 个月+)
→ 混沌实验融入开发流程
→ 新服务上线前需要通过弹性验证
→ 目标:弹性成为工程文化的一部分
组织文化准备
混沌工程不只是技术实践,更是文化变革。在推进时需要注意:
culture_preparation:
common_resistance:
- "在生产环境注入故障?你疯了吗?"
- "这会影响用户体验的"
- "我们没时间做这个"
strategies:
- "从非核心服务开始,用成功案例建立信心"
- "先在测试环境做,团队适应后再上生产"
- "让管理层参与实验设计,理解价值"
- "公开分享发现的弱点和修复成果"
- "把混沌实验纳入 SRE 团队的 OKR"
success_indicators:
- "开发团队主动要求做混沌实验验证新架构"
- "发现的弱点数量在减少(说明系统在变强)"
- "真实故障的 MTTR 在缩短(因为演练过)"
- "团队对故障的恐慌感在降低"
八、混沌工程的度量
关键指标
chaos_engineering_metrics:
experiment_metrics:
- name: "实验执行频率"
target: "核心服务每周至少 1 次"
- name: "实验覆盖率"
formula: "已做实验的服务 / 核心服务总数"
target: "> 80%"
- name: "故障类型覆盖率"
formula: "已测试的故障类型 / 计划测试的故障类型"
target: "> 70%"
outcome_metrics:
- name: "发现的弱点数"
direction: "初期增多,后期减少"
- name: "弱点修复率"
formula: "已修复弱点 / 发现的弱点"
target: "> 80%"
- name: "同类故障复发率"
formula: "混沌实验发现并修复的弱点类型在真实故障中复发的比例"
target: "< 10%"
business_metrics:
- name: "真实故障 MTTR"
direction: "持续下降"
- name: "真实故障导致的 SEV1/SEV2 数量"
direction: "持续下降"
总结
混沌工程的核心价值在于:把"希望系统不出故障"变成"验证系统能承受故障"。这是一个从被动防御到主动验证的范式转变。
关键要点:
- 原理:在正常流量期间主动注入故障,验证系统弹性,在故障变成事故之前发现弱点
- 实验设计:围绕稳态假设设计实验——定义正常状态,注入故障,验证假设是否成立
- 爆炸半径控制:从小开始,自动中止,工作时间执行——安全是第一前提
- Kubernetes 实战:Chaos Mesh 提供了丰富的故障类型和精确的目标选择,是 K8s 生态的首选
- 发现弱点是价值:实验"失败"(稳态被破坏)不是坏事,发现弱点才是目的
- 从演练到常态:分阶段推进,从测试到生产,从手动到自动,最终融入工程文化
记住 Netflix 的那句话:“如果你不主动发现系统的弱点,用户会替你发现——而且代价要大得多。” 混沌工程就是把"被动挨打"变成"主动练兵"的工程方法。
参考资料与致谢
本文在撰写过程中参考了以下资料,感谢原作者的贡献:
- Principles of Chaos Engineering — Principlesofchaos,参考了Principles of Chaos Engineering相关内容
- Chaos Engineering Book — Oreilly,参考了Chaos Engineering Book相关内容