助力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的混沌实践之路 | 京东云技术团队
一、写在前面 1、混沌是什么? 混沌工程(Chaos Engineering)的概念由 Netflix 在 2010 年提出,通过主动向系统中引入异常状态,并根据系统在各种压力下的行为表现确定优化策略,是保障系统稳定性的新型手段。…...
Python系统学习1-4-物理行、逻辑行、选择语句
一、行 (1) 物理行:程序员编写代码的行。 (2) 逻辑行:python解释器需要执行的指令。 (3) 建议: 一个逻辑行在一个物理行上。 如果一个物理行中使用多个逻辑行,需要使用分号;隔开。 (4) 换行: 如果…...
学习系统编程No.35【基于信号量的CP问题】
引言: 北京时间:2023/8/2/12:52,时间飞逝,恍惚间已经来到了八月,给我的第一感觉就是快开学了,别的感觉其实没有,哈哈!看着身边的好友网络相关知识都要全部学完了,就好像…...
词嵌入、情感分类任务
目录 1.词嵌入(word embedding) 对单词使用one-hot编码的缺点是难以看出词与词之间的关系。 所以需要使用更加特征化的表示(featurized representation),如下图所示,我们可以得到每个词的向量表达。 假设…...
TypeScript使用技巧
文章目录 使用技巧TypeScript内置的工具类型keyofextends 限定泛型interface 与 type 区别 TypeScript作为JavaScript的超集,通过提供静态类型系统和对ES6新特性的支持,使JavaScript开发变得更加高效和可维护。掌握TypeScript的使用技巧,可以帮助我们更好地开发和组织JavaScrip…...
MySQL — InnoDB事务
文章目录 事务定义事务特性事务隔离级别READ UNCOMMITTEDREPEATABLE READREAD COMMITTEDSERIALIZABLE 事务存在的问题脏读(Dirty Read)不可重复读(Non-repeatable Read)幻读(Phantom Read) 事务定义 数据库…...
LeetCode 42. 接雨水(动态规划 / 单调栈)
题目: 链接:LeetCode 42. 接雨水 难度:困难 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2…...
顺序表、链表刷题指南(力扣OJ)
目录 前言 题目一:删除有序数组中的重复项 思路: 题解: 题目二:合并两个有序数组 思路: 分析: 题解: 题目三:反转链表 思路: 分析: 题解: 题目四&…...
Lambda表达式总结
Lambda作为Java8的新特性,本篇文章主要想总结一下常用的一下用法和api 1.接口内默认方法实现 public interface Formula {double calculate(int a);// 默认方法default double sqrt(int a) {return Math.sqrt(a);} }public static void main(String[] args) {Form…...
岛屿的最大面积
给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 岛屿的面积是岛上值为 1 …...
迭代器模式(Iterator)
迭代器模式是一种行为设计模式,可以在不暴露底层实现(列表、栈或树等)的情况下,遍历一个聚合对象中所有的元素。 Iterator is a behavior design pattern that can traverse all elements of an aggregate object without exposing the internal imple…...
Goland搭建远程Linux开发
Windows和Linux都需要先构建好go环境,启用ssh服务。 打开Windows上的Goland,建立项目。 点击添加配置,选择go构建 点击运行于,选择ssh 填上Linux机器的IP地址和用户名 输入密码 没有问题 为了不让每次运行程序和调试程序都生…...
react中PureComponent的理解与使用
一、作用 它是一个纯组件,会做一个数据的浅比较,当props和state没改变的时候,不会render重新渲染, 改变后才会render重新渲染,提高性能。 二、使用 三、注意 它不能和shouldComponentUpdate生命周期同时使用。因为它…...
洛谷——P5714 【深基3.例7】肥胖问题
文章目录 题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 AC代码 题目 题目描述 BMI 指数是国际上常用的衡量人体胖瘦程度的一个标准,其算法是 m h 2 \dfrac{m}{h^2} h2m,其中 m m m 是指体重&am…...
Mac隐藏和显示文件
由于之前没有使用过Mac本,所以很多地方都不太清楚,在下载git项目的时候,发现没有.git文件, 一开始还以为下载错了,但是git命令是可以看到远端分支以及当前分支的,之后在一次解压文件的时候发现,…...
软件工程中应用的几种图辨析
【软件工程】软件工程中应用的几种图辨析:系统流程图、数据流图、数据字典、实体联系图、状态转换图、层次方框图、Warnier图、IPO图、层次图、HIPO图、结构图、程序流程图、盒图、PAD图、判定表_眩晕李的博客-CSDN博客 软件工程——实体关系图 状态转换图 数据流…...
下载离线版的VS Visual Studio 并下载指定的版本
一、先下载引导程序 下载地址VS VisualStudio官网 在这个页面翻到最下面 在这里下载需要的版本 下载引导程序 二、下载离线安装包 写一个批处理文件(vs.bat) 命令格式如下 <vs引导程序exe> --layout <离线安装包下载的路径> --add <功能…...
Eureka 学习笔记5:InstanceRegistry
版本 awsVersion ‘1.11.277’ LeaseManager 接口管理实例的租约信息,提供以下功能: 注册实例取消注册实例实例续约剔除过期实例 public interface LeaseManager<T> {/** 注册实例并续约*/void register(T r, int leaseDuration, boolean isRep…...
System Verilog——虚方法的使用
1、使用虚方法目的 通过在父类里定义虚方法(task or function),可以在当父类句柄调用一个方法时候,前提是若是这个句柄指向了子类对象,则调用的方法为子类的方法而不是父类的方法。 1.1、实例理解:将子类句柄赋值成父类句柄 mod…...
线性规划和单纯形法-原理篇
文章目录 引言线性规划标准型问题特点单纯形法 引言 很多运筹学的教材都是从线性规划开始的,我平时做算法策略的落地应用时也研发了一部分基于线性规划的技术方案。可以说,如果搞不懂线性规划,很难成为一名优秀的运筹优化算法工程师。 但是…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
