助力618-Y的混沌实践之路
一、写在前面
1、混沌是什么?
混沌工程(Chaos Engineering)的概念由 Netflix 在 2010 年提出,通过主动向系统中引入异常状态,并根据系统在各种压力下的行为表现确定优化策略,是保障系统稳定性的新型手段。
混沌工程是一门在分布式系统上进行实验的学科,目的是建立人们对于复杂系统在生产环境中抵御突发事件的信息。
2、为什么要做混沌?
混沌工程通过有意地引入故障、异常或不确定性的条件,以模拟真实世界中的不完美环境。其核心思想是通过主动引入故障和异常情况,逐步验证和提升系统的健壮性,从而增加系统在面对真实世界中的复杂环境时的稳定性和可靠性。其目的是识别潜在的系统弱点,并改进应用系统的健壮性和恢复能力,减少系统故障造成的影响,并提供更好的用户体验。
3、混沌的原则
混沌工程主要遵循以下原则:
假设清晰性(Assumption-Driven):明确系统的行为和性能的关键假设。这些假设可以基于系统需求、设计决策或运行环境等方面。混沌工程的实验应着眼于验证或推翻这些假设。
实验的真实性(Experimentation):通过有意地注入故障、异常或不确定性的条件来模拟真实世界中的不完美环境。实验应该是可控和可重复的,以便在安全范围内进行测试和观察系统的响应。
最小化影响(Minimizing Blast Radius):实施混沌实验时需要注意最小化对生产环境和用户的负面影响。合理限制实验的范围和影响范围,并使用适当的风险管理方法保护关键业务功能。
监测和度量(Monitoring and Measurement):实验期间需要密切系统报警机制。使用监控工具和指标来收集实验数据,以便评估系统的稳定性和弹性。
分析和学习(Analyzing and Learning):对实验结果进行复盘,并从中提取经验教训。确定问题的根本原因,并制定相应的改进计划和解决方案。
持续改进(Continuous Improvement):混沌工程是一个持续改进的过程。通过不断地进行实验、分析和修正,提高系统的弹性、稳定性和可恢复性。
二、Y的混沌发展
近三年,京东混沌工程作为大促三道防线之一,在促前扮演了非常重要的角色,而Y的混沌实践,也在不断地进行升级,主要从应用覆盖率和场景覆盖率两个方向明确提升方向,并在集团混沌大赛上取得了一系列突破和成绩。

1、探索阶段(21年)
追溯到21年618,Y主要以探索试点为目标,混沌试验应用覆盖上主要以非0/1级应用为主,演练场景上以断网演练等简单场景为主,攻守双发均为研发。
2、发展阶段(22年)
22年随着京东混沌工程的迭代升级,在演练场景及系统易用性上均有明显改善,Y侧也重点在混沌演练场景上进行全面覆盖,从基础资源故障拓展到外部依赖故障再到高级场景补充,不断提升系统稳定性。同时逐步覆盖0/1级核心系统,并沉淀混沌演练操作手册、混沌演练规范等,演练以测试为攻方,研发为守方,明确职责分工。

22年618由测试同学承接混沌演练,在演练前、演练中、演练后分别推进以下相关工作:
定义演练目标:明确演练目标和期望结果。包含确定要执行的应用系统范围、执行的场景、应用系统监控的配置、故障场景的观测、问题处理机制等,从而提升应用系统健康度。
识别关键组件和场景:确定系统中的关键组件和依赖关系,并识别可能影响系统稳定性和性能的典型场景。这些场景可以包括网络故障、资源耗尽、高并发等。
制定演练计划:制定一份详细的实验计划,包括演练的时间、范围、持续时间以及参与者的角色和职责。确保所有参与者都了解实验计划和预期结果。
设置监控体系:在演练之前,检查泰山中的MDC、UMP、中间件等配置,进一步了解应用的监控信息,根据应用的监控信息,更有针对性的模拟系统故障。
执行演练场景:按照演练计划执行混沌演练,例如模拟网络故障、内存故障、CPU故障、中间件故障等,观察系统的报警信息和研发运维响应,并记录关键指标和事件。
结果复盘:在演练结束后,收集和分析实验期间的数据和观察结果。评估系统的稳定性、可恢复性以及对异常情况的处理能力。识别存在的问题并制定系统的改进方案。
改进和优化:基于演练结果和分析,制定改进计划并采取相应的措施。这可能包括修复漏洞、提高系统的容错性、优化资源利用等。确保经验教训被记录下来,以便未来的演练和运维中可以借鉴。
定期演练和持续改进:通过常态化混沌演练,确保系统的持续的稳定性和弹性。
3、成长阶段(23年)
经过22年的实战总结,23年618 Y 重点推进应用覆盖率提升,最终达到99.68%,零售TOP1。实践策略按照集团要求优先完成系统推荐的9大场景,同时有针对性选择一些特定的场景,完善系统监控,最终0/1级应用健康度>95分,高危项清零。大促期间各系统性能达标,无线上事故发生。在取得阶段性成绩的同时,离不开团队成员在每个阶段都严格遵循以下原则,高标准对待每一次演练:
目标驱动:确保每个演练都有明确的目标和预期结果,以便评估其有效性和价值。
渐进式迭代:逐渐增加演练场景的复杂度和挑战性,使团队能够适应变化并逐步提高系统的健壮性。
持续学习:定期复盘演练结果和反馈,记录每一次的实验案例、问题与挑战,并根据经验教训进行分类与分析、根据复盘结果进行调整和改进。
经验传承:根据总结的经验教训和成功实验案例,制定一份最佳实战指南。这些包含演练计划、场景选择、执行计划、监控以及研发问题处理机制等,帮助团队更好执行混沌演练。
跨团队协作:混沌演练与开发、运维、测试等团队紧密合作,跟混沌工程建设团队多次交流,共同推动应用系统的稳定性和健壮性。
三、混沌与传统测试的区别
混沌工程是一种帮助我们获得更多的关于系统的新认知的实验方法。它和已有的功能测试、集成测试等测试已知属性的方法有本质上的区别。混沌工程,旨在帮助我们获得更多的关于系统的新认知的实验方法,通常还能开辟出一个更广袤的对复杂系统的认知空间。
传统测试,旨在给定一个特定的条件,系统会输出一个特定的二元结果,它仅仅是对已知的系统属性可能的取值进行测验。
混沌工程的思维方式是主动去找故障,是探索性的。虽然按计划做好了降级预案,但是关闭节点时却引发了上游服务故障,进而引发雪崩,这不是靠故障注入或预先计划能发现的。
四、写在后面
混沌工程,是一种提高技术架构弹性能力的复杂技术手段,旨在将故障扼杀在襁褓之中,也就是在故障造成中断之前将它们识别出来。通过主动制造故障,测试系统在各种压力下的行为,识别并修复故障问题,避免造成严重后果。
随着系统新功能不断上线,依赖方变化等,均可能导致系统产生一系列未知故障,故混沌工程实践最重要的就是可持续,通过增加混沌实验的次数不断地发挥混沌工程的价值,Y一直在路上!

作者:京东零售 李金萍 马春荣
来源:京东云开发者社区
助力618-Y的混沌实践之路的更多相关文章
- 从 Spring Cloud 开始,聊聊微服务架构实践之路
[编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. ...
- webp图片实践之路
最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...
- 《程序设计语言——实践之路》【PDF】下载
程序设计语言--实践之路>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382240 内容简介 本书在美国大学已有使用了十余年,目前被欧 ...
- 《程序设计语言——实践之路(英文第三版)》【PDF】下载
<程序设计语言--实践之路(英文第三版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382234 内容简介 <程序设计语 ...
- 《程序设计语言——实践之路【PDF】下载
<程序设计语言--实践之路[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382240 内容简介 <程序设计语言--实践之路(第3版 ...
- WebP 图片实践之路
我们会从三部分来聊聊webp这个话题. 什么是webp,它有什么用? 使用webp的常规方法以及优劣. 我们是如何用上webp的. PS:如果是对webp有一定了解的朋友,建议直接看第三部分.因为是讲 ...
- Followme Devops实践之路
引言 天下武功,唯快不破 想要提高开发团队效率,势必要有一套完整而成熟的开发流程方案,除了sprint迭代开发模式之外,还有近几年流行的devops流程,都是可以大幅度提高开发效率的工具. 我们团队也 ...
- webp图片实践之路(转载)
最近,我们在项目中实践了webp图片,并且抽离出了工具模块,整合到了项目的基础模板中.传闻IOS10也将要支持webp,那么使用webp带来的性能提升将更加明显.估计在不久的将来,webp会成为标配. ...
- 《C++实践之路.pdf》源码
> 源码下载方法 < >> 打开微信 >> 扫描下方二维码 >> 关注林哥私房菜 >> 输入对应编号获取百度网盘提取密码 全书源码[已更新完 ...
- 知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路
本文来自知乎官方技术团队的“知乎技术专栏”,感谢原作者陈鹏的无私分享. 1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动 ...
随机推荐
- 2022-08-01:以下go语言代码输出什么?A:panic;B:5;C:6;D:编译错误。 package main import ( “fmt“ ) func main() {
2022-08-01:以下go语言代码输出什么?A:panic:B:5:C:6:D:编译错误. package main import ( "fmt" ) func main() ...
- 2022-04-09:给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m , 数组下标 从 1 开始 计数。 初始时,你的分数为 0 。 你需要执行恰
2022-04-09:给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m , 数组下标 从 1 开始 计数. 初始时,你的分数为 0 . 你需要 ...
- 2021-11-28:有一棵树,给定头节点h,和结构数组m,下标0弃而不用。 比如h = 1, m = [ [] , [2,3], [4], [5,6], [], [], []]
2021-11-28:有一棵树,给定头节点h,和结构数组m,下标0弃而不用. 比如h = 1, m = [ [] , [2,3], [4], [5,6], [], [], []], 表示1的孩子是2. ...
- 2021-10-29:除自身以外数组的乘积。给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之
2021-10-29:除自身以外数组的乘积.给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i ...
- Java 网络编程 —— 非阻塞式编程
线程阻塞概述 在生活中,最常见的阻塞现象是公路上汽车的堵塞.汽车在公路上快速行驶,如果前方交通受阻,就只好停下来等待,等到公路顺畅,才能恢复行驶. 线程在运行中也会因为某些原因而阻塞.所有处于阻塞状态 ...
- url函数
url() 函数看起来的格式象:url(r^/account/$', views.index, name=index),它可以接收四个参数,分别是两个必选参数:regex.view 和两个可选参数:k ...
- uni-app 打包发行
1.云端 发行-原生App-云打包 2.离线 运行-原生App本地打包-生成本地打包资源,如果提示安装依赖包,安装即可 注意:项目的AppID不能为空,请在该项目下的manifest.json中重新获 ...
- F对象和Q对象
F对象 批量计算 Q对象,与或非
- 这款全自动自适应工具你用过了吗?autofit.js请求加入你的战场!
前段时间做了一个自适应的小工具(autofit.js) 经过一段时间的试用,同学们发现了工具存在的一些问题,我自己也发现了一些,这篇文章是针对这些问题撰写的. autofit.js autofit.j ...
- mysql字段添加中文提示Data too long
解决方法: 新建一个数据库,字符集选择utf8