概述
本文总结了京东在混沌工程领域的实践经验,介绍如何通过主动注入故障的方式提前发现系统隐患,以及如何在实际业务场景中进行混沌演练。
核心内容:
- 🎯 混沌工程的基本概念和价值
- 🔄 完整的混沌演练流程
- 📊 典型演练场景和监控指标
- 🔗 业务链路演练实践
文章来源:
混沌工程基础
什么是混沌工程
混沌工程是通过主动制造故障场景并根据系统在各种压力下的行为表现确定优化策略的一种系统稳定性保障手段。
核心理念:
- 🔍 主动发现:在生产环境出问题之前主动找出隐患
- 🛡️ 提前加固:针对发现的脆弱点进行针对性加固
- 📈 持续改进:通过反复演练不断提升系统韧性
简单来说: 通过主动注入故障的方式,提前发现问题,然后解决问题规避风险。
为什么要进行混沌演练
架构复杂度挑战:
随着互联网业务发展,微服务架构、分布式架构和虚拟化容器技术的广泛普及:
- 📐 软件架构的复杂度不断提升
- 🔗 服务之间的依赖呈指数级增长
- 🦋 任何一环的变化都可能产生蝴蝶效应
业务增长压力:
目前营销体系的挑战:
- 服务量级不断增加
- 整体链路增长
- 数据流转复杂
解决方案价值:
引入混沌演练的好处:
- ✅ 主动找出系统脆弱环节
- ✅ 针对性地进行加固防范
- ✅ 避免故障带来的严重后果
- ✅ 提升业务系统高可用性
- ✅ 提高应急保障能力
混沌演练的价值
应用混沌演练可以:
- 🔬 校验系统能力:验证系统抵抗扰动并保持正常运作的能力
- 🎯 提前识别隐患:发现未知的系统脆弱点
- 🛠️ 主动修复问题:在生产故障发生前解决问题
- 💪 提升稳定性:保障系统更好地抵御失控条件

混沌演练实践流程
演练流程概览
京东通过 RPA 自动化服务平台进行混沌攻防演练:
角色分工:
- 🔴 红方(攻击方):测试人员,负责注入故障
- 🔵 蓝方(防守方):研发人员,负责故障感知和应急处理
演练目标:
通过攻防对抗的方式,达到针对系统高可用的应急演练效果。

红方操作流程
创建演练计划
- 访问 RPA 自动化服务平台
- 进入 工具市场 → 演练类
- 选择不同的故障方案
- 点击"立即执行"
演练配置
进入配置页面后:
- 选择执行环境
- 选取要演练的应用
- 随机选取要演练的实例 IP
执行演练
演练任务创建完成后:
- 在对应的演练时间范围内提交
- 审批通过后开始执行
- 按照选择的演练任务开始注入故障
蓝方响应流程
故障排查
在演练过程中:
- 📧 通过报警信息定位问题
- 🔍 对模拟故障的实例机器进行排查
- 📊 分析监控指标变化
恢复方案
- ⚡ 演练中:发现问题要及时恢复
- 🔄 演练后:重启故障实例机器
- ✅ 验证:确保机器正常运行,各项性能指标恢复
初次演练实践案例
准备阶段
演练准备阶段的核心工作:
关键任务:
- 🎯 设定演练的考核目标
- 📋 选择演练的场景、应用和机器
- 📝 生成相应的演练计划
- 📢 周知相关人员
风险评估(最重要):
根据系统的等级或混沌成熟度,循序渐进:
| 阶段 | 演练内容 | 风险程度 |
|---|---|---|
| 初期 | 高 CPU、高内存 | 低 |
| 中期 | 网络延迟、磁盘 IO | 中 |
| 高级 | 进程终止、服务降级 | 高 |

执行阶段
执行故障注入
演练场景: JSF 接口响应延迟 100ms
前置条件:
- 接口超时时间设置为 50ms
- 故障注入时长:15 分钟
观察要点:
- 📊 观察日志和系统监控
- 📈 记录指标变动情况
监控数据分析
监控图表显示:
故障注入期间:
- ❌ 接口超时失败率:100%
- ⏱️ 响应时间:显著增加
- 🔴 错误数量:持续上升

恢复阶段
故障发现
蓝方响应过程:
接收报警
- 📧 收到 CPU 使用率负载告警
- 🔍 报警机器与演练机器相同
排查定位
- 📊 检查服务器监控指标
- 🔎 分析日志记录
- 🎯 定位具体故障原因
应急处理
- 🔄 重启受影响的服务
- ✅ 验证服务响应正常
- 📈 确认可用率恢复

复盘阶段
发现的问题
通过本次演练,发现两个待优化的点:
问题一:监控告警延迟
- 🐛 现象:CPU 使用负载的演练场景中,监控告警邮件有延迟
- 💡 改进方案:增加电话和咚咚(企业 IM)报警策略
问题二:缺少关键告警
- 🐛 现象:模拟 JSF 接口响应超时场景,缺少失败阈值告警邮件
- 💡 改进方案:增加相应告警邮件配置
优化措施总结

改进计划:
- ✅ 完善多渠道告警机制
- ✅ 补充关键指标监控
- ✅ 优化告警规则配置
- ✅ 提升故障响应速度
演练场景与指标体系
典型演练场景
借助平台进行混沌演练,可以降低学习成本,提高演练效率。
平台支持的常用场景:
| 场景类别 | 具体场景 | 影响范围 |
|---|---|---|
| 资源类 | CPU 满载 | 计算能力 |
| 内存满载 | 内存资源 | |
| 磁盘 IO | 存储性能 | |
| 网络类 | 网络延迟 | 响应时间 |
| 网络丢包 | 数据传输 | |
| 网络隔离 | 服务调用 | |
| 应用类 | 进程终止 | 服务可用性 |
| 方法延迟 | 接口性能 | |
| 接口异常 | 错误处理 |

场景选择建议:
- 🎯 根据系统特点选择合适场景
- 📊 从简单到复杂逐步推进
- 🔄 定期轮换不同类型场景
重要考核指标
混沌演练结束后,需要根据执行过程和结果进行评估。
核心指标体系:
一级指标:时效性
关注故障"发现-定位-恢复"的全流程时间:
| 指标 | 说明 | 目标值 |
|---|---|---|
| 发现时间 | 从故障发生到接收告警 | < 1 分钟 |
| 定位时间 | 从接收告警到确定原因 | < 5 分钟 |
| 恢复时间 | 从确定原因到服务恢复 | < 10 分钟 |
| 总响应时间 | 发现到恢复的总耗时 | < 15 分钟 |
二级指标:完善度
| 维度 | 检查项 | 评估标准 |
|---|---|---|
| 监控告警 | 是否有告警 | 完整覆盖 |
| 告警渠道 | 多渠道通知 | |
| 告警内容 | 信息完整 | |
| 容错能力 | 降级策略 | 是否生效 |
| 熔断机制 | 是否触发 | |
| 重试策略 | 是否合理 | |
| 响应机制 | 应急预案 | 是否完善 |
| 团队协作 | 是否高效 | |
| 问题修复 | 是否彻底 |
三级指标:高可用性(探索性)
根据具体业务场景定义:
- 📊 服务可用率(SLA)
- ⏱️ 接口响应时间(P99/P999)
- 💰 业务损失评估
- 👥 用户体验影响

风险控制措施
混沌演练会对业务和系统产生破坏性影响,必须做好风险控制。
控制目标:
- 限制发现应用程序漏洞的成本
- 避免不必要的损坏
- 控制在合理测试范围内
关键控制点:
爆炸半径控制
| 控制维度 | 控制措施 | 说明 |
|---|---|---|
| 环境隔离 | 优先预发环境 | 避免影响生产 |
| 实例限制 | 单实例演练 | 减少影响范围 |
| 时间控制 | 非高峰时段 | 降低业务影响 |
| 流量控制 | 限制演练流量 | 保护核心业务 |
应急预案
- 🚨 准备快速回滚方案
- 👥 确保人员在线响应
- 📞 建立应急沟通机制
- 🔄 预设自动恢复策略

重要提示:
尽管混沌演练的好处显而易见,但它是一种应该慎重进行的实践。必须在充分评估风险的基础上,制定详细的应急预案后再执行。
业务链路演练实践
背景与目标
业务背景
当前微服务架构下的挑战:
- 🔗 各服务间依赖度高
- 🕸️ 调用关系复杂
- 🎯 业务场景涉及多个上下游系统
核心问题:
- 如何减少系统间耦合性?
- 如何避免单点故障影响全链路?
演练目标
通过混沌演练验证:
- ✅ 部分系统故障时整体链路的表现
- ✅ 链路保持正常运作的能力
- ✅ 提前识别未知隐患
- ✅ 提升整体场景功能稳定性
内容加载链路演练
链路梳理
业务场景: 内容加载流程
系统调用链路:
1 | 摹略引擎执行 → AB 分流 → CMS 资源获取 → 鹰眼内容发送 |

链路特点:
- 🔄 多系统协作
- ⚡ 实时性要求高
- 📊 数据流转复杂
接口梳理
根据链路调用关系梳理具体接口:

关键接口列表:
| 系统 | 接口 | 作用 | 超时时间 |
|---|---|---|---|
| 摹略引擎 | executeEngine | 执行业务逻辑 | 100ms |
| AB 分流 | routeRequest | 流量分配 | 50ms |
| CMS | getResource | 获取内容资源 | 200ms |
| 鹰眼 | sendContent | 内容推送 | 150ms |
制定演练计划
演练时间: 2023.03.28 14:00-22:00
人员分工:
- 🔴 攻击方:孙X英、陈X然
- 🔵 防守方:张X雷、付X军、刘X、韩X
场景设计原则:
根据系统特点设计故障场景:
- ⚙️ 偏计算的系统 → CPU 满载场景
- ⏱️ 响应敏感的系统 → 方法延迟场景
- 🔗 依赖多的系统 → 网络故障场景
具体演练场景:

| 序号 | 系统 | 故障类型 | 故障参数 |
|---|---|---|---|
| 1 | 摹略引擎 | CPU 满载 | 100% 利用率 |
| 2 | AB 分流 | 进程满载 | 指定进程 |
| 3 | CMS | 方法延迟 | 增加 50ms |
| 4 | 鹰眼 | 网络延迟 | 增加 100ms |
参考资料:
演练执行详解
使用天权平台
操作步骤:
选择场景
- 进入 工具市场 → 演练类
- 选择对应的故障方案
- 点击"立即执行"
配置参数(以 Java 进程满载为例)
- 满载率:100%
- 满载核数:服务器 CPU 核数
- 演练时长:持续时间
- 目标应用:具体应用名称
- 目标 IP:指定服务器 IP
演练示例一:方法延迟
场景: 精准触达系统 - 消息触达方法延迟
配置参数:
- 延迟时间:30ms
- 目标方法:sendMessage
- 演练时长:15 分钟

演练示例二:CPU 满载
场景: 分流服务 - Java 进程满载
配置参数:
- 目标进程:分流服务进程
- CPU 满载率:100%
- 演练时长:10 分钟
执行结果:

监控与反馈
实时监控
监控目标:
使用监控工具实时收集:
- 🖥️ 系统层面:CPU、内存使用情况
- ⏱️ 接口层面:响应时间、成功率
- 📊 业务层面:关键指标变化
监控作用:
- ✅ 验证故障是否达到预期效果
- 📝 记录演练期间发生的问题
- 🚨 发现风险及时人工干预
- 🛑 必要时立即终止演练
场景一监控数据
精准触达系统 - 消息触达方法延迟 30ms
监控指标:
- 方法执行成功率
- TP999(99.9% 分位响应时间)

数据分析:
- 📉 成功率轻微下降(98% → 95%)
- ⏱️ TP999 从 50ms 增加到 85ms
- ✅ 系统具备一定容错能力
场景二监控数据
分流服务 - Java 进程 CPU 满载
监控平台实时观测:

数据分析:
- 📈 CPU 使用率达到 100%
- ⚠️ 响应时间显著增加
- 🔴 部分请求出现超时
告警反馈
邮件事故告警:

告警内容包括:
- ⏰ 故障发生时间
- 🎯 故障服务器 IP
- 📊 具体指标数值
- 🔍 初步问题定位
事故恢复告警:

恢复信息包括:
- ✅ 服务恢复时间
- 📊 关键指标恢复情况
- 🔄 恢复操作说明
环境恢复
恢复方式:
自动恢复:
- ⏱️ 等待演练时长结束
- 🔄 系统自动中止故障注入
手动恢复:
- 🛑 手工取消演练场景
- 🔧 终止正在执行的任务
重要提示:
⚠️ 演练完成后建议重启容器,确保服务恢复到正常状态,避免残留影响。
恢复验证:
- ✅ 服务启动正常
- ✅ 各项性能指标正常
- ✅ 接口调用正常
- ✅ 业务功能正常
演练复盘
演练结束后,需要对演练进行全面复盘:
复盘内容:
- 📊 不同故障下系统的表现
- 💥 整体业务场景所受到的影响
- 🐛 演练过程中发现的问题
- 💡 改进建议和优化方案

复盘报告应包含:
演练概况
- 演练时间和范围
- 参与人员
- 演练场景列表
问题清单
- 发现的系统问题
- 监控告警问题
- 流程改进建议
改进计划
- 短期优化措施
- 中期改进计划
- 长期建设目标
经验总结
- 成功经验分享
- 注意事项提醒
- 最佳实践建议
总结与展望
核心价值
链路演练通过提前主动注入故障:
- 🔍 发现系统之间的强弱依赖
- 🔬 对链路进行全面检验
- 📉 降低生产环境故障概率
- 💪 提升整体系统韧性
最佳实践建议
循序渐进:
- 📖 从理论学习到实际操作
- 🎯 从简单场景到复杂链路
- 🏗️ 从预发环境到生产环境
持续改进:
- 🔄 定期进行混沌演练
- 📊 持续跟踪改进效果
- 🎓 不断总结经验教训
团队协作:
- 👥 建立跨团队协作机制
- 📞 完善应急响应流程
- 🎯 提升全员稳定性意识
展望未来
混沌工程在京东的实践还在不断深化:
- 🚀 自动化程度持续提升
- 🌐 覆盖场景不断扩展
- 🧠 智能化决策逐步引入
- 📈 稳定性保障能力持续增强
参考资源
官方文档
相关工具
- RPA 自动化服务平台:京东云混沌演练平台
- 天权平台:自动化运维平台
- 监控系统:实时性能监控工具
扩展阅读
- Chaos Engineering 原理与实践
- Netflix Chaos Monkey 实践
- 阿里巴巴混沌工程实践
- 微服务架构下的稳定性保障