
混沌工程:测试系统韧性
核心原则
1. 定义稳态(正常行为指标)
2. 假设:“当 X 故障时,系统将维持稳态”
3. 在生产环境(或类似生产的预发布环境)中运行实验
4. 学习并修复弱点
5. 自动化并持续运行
从小处着手:仅在预发布验证后才进行生产混沌实验

混沌实验类型
基础设施:
- 杀死随机 Pod(混沌猴)
- 服务间的网络分区
- 节点上的高 CPU/内存
- 磁盘 I/O 延迟/错误
应用:
- 在服务调用中注入延迟
- 在依赖中抛出异常
- 损坏负载
- 导致依赖超时
状态:
- 填满磁盘空间
- 用垃圾数据填满数据库
- 清除缓存(Redis/CDN)
- 回滚数据库连接
Litmus Chaos(Kubernetes)
# chaos-experiment.yaml - 杀死随机 Pod
apiVersion: litmuschaos.io/v1alpha1
kind: ChaosEngine
metadata:
name: pod-kill-experiment
spec:
appinfo:
appns: production
applabel: app=api-server
chaosServiceAccount: litmus-admin
experiments:
- name: pod-delete
spec:
components:
env:
- name: TOTAL_CHAOS_DURATION
value: '60' # 60 秒
- name: CHAOS_INTERVAL
value: '10' # 每 10 秒杀死一个 Pod
- name: FORCE
value: 'false' # 优雅终止
# 网络混沌:向支付服务调用添加 200ms 延迟
- name: pod-network-latency
spec:
components:
env:
- name: NETWORK_LATENCY
value: '200'
- name: DESTINATION_IPS
value: "10.0.0.1" # 支付服务 IP
- name: TOTAL_CHAOS_DURATION
value: '300'

应用级故障注入
class FaultInjectionMiddleware {
constructor(private faultRate: number = 0) {}
async execute<T>(fn: () => Promise<T>): Promise<T> {
if (process.env.NODE_ENV !== 'production' || !this.isEnabled()) {
return fn();
}
if (Math.random() < this.faultRate) {
const fault = this.pickFault();
console.log(`[CHAOS] Injecting fault: ${fault.type}`);
switch (fault.type) {
case 'latency':
await new Promise(r => setTimeout(r, fault.delayMs));
break;
case 'error':
throw new Error('Injected fault');
case 'timeout':
await new Promise(r => setTimeout(r, 30000)); // Cause timeout
break;
}
}
return fn();
}
private isEnabled(): boolean {
return process.env.CHAOS_ENABLED === 'true';
}
}
游戏日规划

## 游戏日模板
**日期**:2024-03-15
**假设**:“当支付服务不可用时,结账流程优雅降级,显示错误消息,而购物车和浏览功能保持正常。”
**实验**:
1. 杀死所有 payment-service Pod
2. 验证购物车/浏览功能仍然正常
3. 验证结账显示错误(而非 500)
4. 验证告警在 5 分钟内触发
5. 验证支付服务在重启后恢复
**稳态**:
- 结账成功率 > 99%
- 错误率 < 0.1%
**回滚计划**:
- 如果...立即重启 payment-service Pod
**结果**:
- 发生了什么:
- 发现的弱点:
- 需要的修复:
衡量韧性
// 平均检测时间(MTTD)
// 平均恢复时间(MTTR)
// 错误预算消耗
async function measureResilience(experiment: ChaosExperiment): Promise<ResilienceReport> {
const startTime = Date.now();
await experiment.inject();
const detectionTime = await waitForAlert();
const recoveryTime = await waitForSteadyState();
return {
mttd: detectionTime - startTime,
mttr: recoveryTime - startTime,
impactDuration: recoveryTime - detectionTime,
errorsGenerated: await countErrors(startTime, recoveryTime),
};
}
混沌工程将理论韧性转化为经过验证的韧性。