混沌工程:故障注入与韧性测试
混沌工程:故障注入与韧性测试
概述
混沌工程是通过主动引入故障来测试系统韧性的实践。本教程介绍混沌工程的概念和实践。
1. 混沌工程原则
// 混沌工程原则
// 1. 建立稳定状态假设
// 2. 引入真实世界事件
// 3. 观察稳定状态
// 4. 持续自动化实验
// 5. 最小化爆炸半径
// 常见故障类型
// 1. 网络故障:延迟、丢包、分区
// 2. 服务故障:宕机、超时、错误
// 3. 资源故障:CPU、内存、磁盘
// 4. 依赖故障:数据库、缓存、消息队列
2. Chaos Monkey
import org.springframework.stereotype.Component;
@Component
public class ChaosMonkey {
private final Random random = new Random();
public void injectLatency(int maxLatencyMs) {
try {
int latency = random.nextInt(maxLatencyMs);
Thread.sleep(latency);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public void injectException(double probability) {
if (random.nextDouble() < probability) {
throw new RuntimeException("混沌故障注入");
}
}
public void injectFailure(String failureType) {
switch (failureType) {
case "timeout":
throw new TimeoutException("超时故障");
case "network":
throw new NetworkException("网络故障");
case "database":
throw new DatabaseException("数据库故障");
}
}
}
3. 实际应用示例
网络延迟注入
@Component
public class NetworkChaos {
public void injectLatency(String target, int latencyMs) {
// 使用tc命令注入网络延迟
Runtime.getRuntime().exec("tc qdisc add dev eth0 root netem delay " + latencyMs + "ms");
}
public void removeLatency(String target) {
Runtime.getRuntime().exec("tc qdisc del dev eth0 root");
}
}
服务故障注入
@Component
public class ServiceChaos {
@Autowired
private ChaosMonkey chaosMonkey;
public User getUser(Long id) {
// 注入延迟
chaosMonkey.injectLatency(1000);
// 注入异常
chaosMonkey.injectException(0.1);
return userRepository.findById(id).orElse(null);
}
}
端到端混沌测试
@SpringBootTest
public class ChaosTest {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void testResilience() {
// 正常情况
ResponseEntity<User> response = restTemplate.getForEntity("/api/users/1", User.class);
assertEquals(HttpStatus.OK, response.getStatusCode());
// 故障注入后
chaosMonkey.injectFailure("timeout");
response = restTemplate.getForEntity("/api/users/1", User.class);
assertEquals(HttpStatus.SERVICE_UNAVAILABLE, response.getStatusCode());
}
}
4. 最佳实践
- 从小规模开始:逐步扩大故障范围
- 自动化实验:定期自动执行混沌实验
- 监控和告警:实时监控系统状态
- 回滚计划:准备故障回滚方案
- 文档化:记录实验结果和改进措施
总结
混沌工程是通过主动引入故障来测试系统韧性的实践。掌握混沌工程的概念和实践,可以构建更可靠、更健壮的系统。