问题背景:大型APP质量保障困境
之前手机淘宝客户端的研发质量保障体系大致如下, 研发期会进行需求管控、代码扫描、单元测试、UI测试、性能、稳定性等专项测试、适配回归等保证集成质量。发布期会对要发布产物进行一系列的发布卡口检查,如包产物校验、高可用检查、功能回归检查、适配确认等,还会通过灰度发布来进行更多系统、机型、用户场景的覆盖, 补充覆盖到线下测试无法覆盖到的盲区, 期间收集相关的稳定性、高可用问题、舆情体验问题,修复完成后才会进行正式发布。 此外对于大促版本,还会对大促相关活动进行发版前的提前验收,以确保不会有大促态下的叠加问题。 到了版本发布完成后的运维期, 主要是进行监控、告警处理、问题定位、问题恢复等线上运维活动。当我们做完这些质量保障工作,会发现线上问题仍然存在, 有时甚至会有严重的故障。
研发质量管控体系
发布期
运维期
研发期
监控&告警
发布卡口
代码扫描
需求管控
回滚降级
专项测试
灰度发布
单元测试
大促验收
开关
适配回归
UI自动化
做好了每一个环节,可线上仍有故障!
lnfoQ
acon
类似手机淘宝这样的大型APP可能都会遇到类似的质量保障困境, 究其原因, 还是由于大型APP自身的系统特性及发布节奏所决定的:
- 一方面, 由于互联网产品迭代速度快, 客户端版本往往一月已发布,甚至每周一发布,在有限的时间内,考虑到ROI, 会主要去保障主链路和重点场景, 一些长尾场景可能被遗漏;
- 另一方面, 由于动态化因素众多导致发布前的线下及灰度测试是不可能覆盖全面所有的场景,发现全部的问题;
- 业务多、模块多:依赖复杂, 模块相互之间的影响是黑盒的、混沌的;
- 二方、三方生态繁荣:开发者不仅来自手淘内部,也有集团还有外部研发者, 已经建立了相关的准入机制,但难免有不可控和遗漏的部分;
- 变更多、发布多:服务端、前端、配置、Push推送, 以及营销活动等都可能对端侧代码路径造成影响;
大型APP的质量保障困境
业务多,模块多
G6O
18:81808
直播
详情
购物车
消息
首页
二方,三方生态繁荣
商家群
店铺
品牌号
小程序
55:5
变更多,发布多
前端页面
配置推送
Push推送
服务端应用
acon
lnfoQ
还有一个很重要的因素——外部不可控因素。线下测试可以覆盖全面用户使用的真实设备和操作系统版本。客户端应用的体验会受到操作系统和手机厂商的影响, 由于系统和手机厂商经常会有升级更新, APP研发人员需要紧跟其脚步,每次苹果或者Android系统升级都可能带来一些不可预期的问题。
解决思路:基于混沌工程建设客户端攻防演练
介于前面介绍的事实,我们会发现一个悲观的事实, 在发布前发现所有的问题是不可能的。我们可以做的是:1. 减少意外问题发生的可能性;2. 降低问题发生时带来的影响。服务端分布式系统较多,应对未知问题的经验比较多,客户端可以借鉴。
混沌工程是近年来服务端分布式架构应对未知风险的其中一项比较热门的实践。“混沌工程原则”网站给出了下面的定义——混沌工程是一门对系统进行实验的学科,旨在了解系统应对生产环境的各种混乱状况的能力,建立对系统的信心。攻防演练是混沌工程的一个子集, 通过沉淀通用的故障模式,以可控成本在线上进行重放, 以持续性的演练和回归方式来暴露问题, 不断推动系统、工具、流程、人员能力的不断演进。
混沌工程:是一门对系统进行实验的学科,旨
在了解系统应对生产环境的各种混乱状况的能
力,建立对系统的信心
攻防演练:目标是沉淀通用的故障模式,以可
控成本在线上重放,以持续性的演练和回归方式
运营来暴露问题,不断推动系统,工具,流程,
人员能力的不断前进
lnfoQ
Con
客户端作为一个广义意义上的分布式系统, 因此也可以参考混沌工程的理念来提升其健壮性,降低故障发生的风险。经过评估,我们发现攻防演练可以一定程度补充和完善客户端质量保障的能力。
- 面向失败设计:为了避免失败去提前往系统注入失败并想好应对规避策略以及预案;
- 验证链路高可用:通过故障注入,去验收证明全链路的高可用性, 包括监控、告警、定位、恢复体系;
- 提升应急能力:通过故障演练, 提升研发团队应对线上问题时的应急能力;
如何解决系统性风险
验证链路
高可用
提升应急
面向失败
能力
设计
混沌
工程
InfoQ
Con
此外, 攻防演练对项目其他角色也具有一定的意义:
- 对于架构&研发, 在架构和技术方案设计时,可以设想在不同场景下可能导致系统失败的各种因素,并在方案中对失败进行预防处理;
- 对于研发&运维, 可以在发生问题时及时找到提前设计好的恢复预案进行操作, 达到快速恢复的目的。同时通过类线上环境的故障演练, 可以提高应急能力;
- 对于产品&设计, 可以对系统出现异常情况下的产品体验做出优化, 并验收产品;
- 对于支撑&平台,能够对监控、告警、定位、恢复的线上运维全链路系统进行验收, 并且发现薄弱点加以改进;
对各角色的意义
架构&研发:
研发&运维:
风险识别
提高应急能力
面向失败设计
快速恢复
产品&设计
支撑&平台:
验收全链路系统
验收产品
优化异常体验
发现薄弱点
lnfoQ
Con
从研发全生命周期来看,研发到线上运维各阶段都可以进行攻防演练。
对研发流程的意义
告警
恢复
发布
研发
定位
响应
CR有效性
分发效率
灰度有效性
开关实时性
故障覆盖度
定位能力
开关到达率
发布规范
响应效率
排查能力
预案设计
监控有效性
acon
InfoQ
具体方案:客户端攻防演练实施原则及体系
实施混沌工程有5大原则:第一是建立一个围绕稳定状态行为的假说, 需要定义一系列能够描述系统处于稳定状态的相关指标,服务端可以是请求成功率、RT等,客户端则是另一套指标,后文会继续介绍。第二是多样化真实世界的事件, 能够覆盖全面真实世界中的各类事件。第三是在生产环境中运行实验,这样得到的实验结果才是最贴近真实情况的,实验环境往往不被大家所信任,为了屏蔽不必要的影响(实验环境数据不同,配置不同导致差异等),应该尽量在真实的生产环境中进行混沌工程实验。第四是持续自动化运行实验, 混沌工程本身应该是一个持续迭代的过程,通过混沌工程发现的问题,得到修复后希望可以加以验证。如果该过程不是自动化可持续进行的,会导致实施成本太高, 难以常态化进行。第五是最小化爆炸半径,因为混沌工程是有损的,会对系统造成一定的影响, 所以希望不会因为实验对真实用户体验带来伤害,最好能将其影响面控制到一定的范围内,可以随时终止。
混沌工程及其实施原则
建立一个围绕稳定状态行为的假说
多样化真实世界的事件
在可控范围内对
在生产环境中运行实验
系统注入故障
持续自动化运行实验
最小化爆炸半径
InfoQ
con
从混沌工程的5大原则,我们可以结合客户端特点总结出客户端攻防演练的5大原则:符合客户端特点的稳定状态假说, 全面覆盖客户端故障类型,在生产环境但不影响真实用户, 可持续开展,过程可度量。
客户端攻防演练原则
稳定状态
假说
过程可度
全面覆盖
故障类型
不影响真
可持续开
展
实用户
lnfoQ
Con
第一个实施原则是需要定义出客户端的稳定状态假说, 可以分为以下4个具有客户端特色的领域:第一是稳定性指标,包括Crash率、ANR率等, 第二是性能或高可用指标, 包括客户端内存、CPU、FPS等性能指标, 以及性能问题如主线程卡顿、内存泄露等。第三是功能指标, 和业务特性强相关, 各类业务指标、异常埋点等,如页面打开成功率、视频播放成功率等。第四是体验指标, 如启动时间、页面响应时长、白屏率等。
客户端稳定状态假说
性能
稳定性
Crash,ANR/Abort
内存,CPU.主线程卡顿...
体验
功能
具有业务特性,异常埋点,业务指标等
启动时间,页面响应时间
aCon
InfoQ
BUOOOOAO
第二个实施原则是要全面覆盖客户端故障类型。市面上大部分混动实验工具都是服务端的,主要是系统、应用、容器等实验场景。客户端也可以参考类似思路,将客户端的故障类型分层梳理出来。这里我们把客户端故障类型氛围了三层, 系统层、中间件层和业务层, 各层次对应的故障类型如下图所示:
全面覆盖客户端故障类型
消息
首页
直播
购物车
下单
业务层
功能异常
卡顿/耗电
点击无效
崩溃闪退
页面白屏/异常
覆盖客户端各
基础服务
JS异常
跳转拦截
配置中心异常
容器异常
层次可能发生
的故障点
请求超时
中间件
请求失败
请求不可访问
请求异常
网络层
数据库读失败
缓存读失败
数据层
缓存写失败
数据库写失败
系统层
CPU过高
内存过高
线程池满
磁盘空间满
系统API异常
lnfoQ
Con
第三个实施原则是尽量真实但又不能影响真实用户,这个原则要求比较矛盾, 如果要尽量贴近真实,那么大概率会使用真实环境, 不可避免的影响到真实用户。客户端相较服务端有一个特点:只有通过应用市场和自有渠道发布出去的正式包才会影响真实用户,如果打出和正式包相同代码的测试包注入问题在线下进行攻防演练,是不会对真实用户造成实际影响的。因此我们采取的方案是通过在真机实验室安装特殊的APP包来隔离线上环境,通过自动化去不断的触发这些故障场景。监控数据上报到服务端后,对相关数据加以放大,使之能达到故障或问题的告警门限,触发线上问题。同时这些监控数据也被打上了特殊标记,避免污染真实数据。
不影响真实用户
线上环境
实验室环境
真机实验室+特殊应用包
数据
体验
异常
lnfoQ
COn
第四个实施原则是可持续开展, 这里主要是通过场景自动化和配置沉淀复用实现的。场景自动化是把故障场景通过自动化脚本的方式沉淀下来, 可以通过自动化反复在真机实验室触发。配置沉淀复用是指把注入配置、攻击场景、计划进行分层,不同层次的配置可以重复组合使用,达到降低攻防演练准备成本的目的。
可持续开展
场景自动化
真机实验室
触发脚本
演练计划
逻辑分层
攻击场景
沉淀复用
注入配置
lnfoQ
acon
第五个实施原则是过程可度量, 攻防演练需要对参与的红军进行量化的评估,因此我们将线上问题应急的过程进行了划分,定义了以下几个阶段:问题发生(问题实际发生的时间), 问题上报(问题通过数据通道上报到监控系统的时间),问题发现(达到问题门限,触发告警时的时间), 问题响应(相关业务收到告警上线处理问题的时间), 问题定位(相关业务定位到问题原因的时间), 问题处理(开始实施恢复手段的时间), 问题恢复(系统真正恢复到正常状态的时间)。我们与监控系统、告警系统、问题处理响应系统进行了打通,采集了这些关键节点的数据,用于演练后的过程度量。
过程可度量
问题上报
问题响应
问题恢复
问题定位
问题处理
问题发生
问题发现
发现时长
响应时长
定位时长
止血时长
恢复时长
lnfoQ
Con
上面介绍了客户端攻防演练的实施原则, 下面将介绍下具体的实现方案。可能的实现方案主要有以下4种,围绕他们的使用成本、场景覆盖和真实性进行了分析, 最终选定了端侧SDK+注入配置的方案。
实现方案比较
方案
使用成本
真实性
场景覆盖
高中中低
高全较真实
代码修改
部分
中中
服务端注入
部分
日志注入
端侧SDK+注
较真实
较全
入配置
下面是客户端攻防演练的整体方案,分为蓝军和红军两方。蓝军主要由安全生产小组、架构专家、业务专家组成,主要目标是通过攻击工具对业务发起攻击。红军主要由业务开发和测试同学组成, 主要目标是在攻击发生时,使用发现、定位、恢复工具对故障进行快速响应和恢复。
整体方案
攻击业务
红军
发现响应恢复
PO级:首页交易详情店铺
安全生产小组
攻击
P1级:导购微淘消息我的淘宝
业务开发
防守
startTime
架构,业务专家
recoveryTime
业务测试
客户端
环境:
手淘测试真机隔离环境
攻击
发现
口
工具
攻击注入
攻击发起
系统
工具
亚务
中间件
业务告警
Crash告警
攻击类型
定位工具
支付:付不了款
详情:领不了券
交易:下
业务
首页:
服务端日志
Tlog
舆情日志
Crash日志
不了单
点击无法跳转
恢复手段
中间件
定位
埋点
网络库
webview
weex
图片库配营库
小程序
基础
容器
核心
系统
开关
数据降级
服务端降级
预案
写入
读取
高内存高存储
域名拦载
限流
高CPU
CDN
失败
失败
不可用
性能
存储
网络
aCon
InfoQ
全球软件开发大会
下面这张图是攻防演练平台的总体架构, 最核心的部分是攻防演练配置中控台,以及注入SDK。蓝军通过配置中控台进行演练场景的配置, 该配置通过配置下发通道下发, 端侧SDK收到配置后进行解析和注入。
总体架构
攻防演练配置&中控
配置下发通道
数据采集服务
攻防演练
平台
服务端注入
客户端注入SDK
前端端注入SDK
打包平台
真机实验室
过程数据收集
数据上报通道
数据放
数据埋点
应用回滚
问题通知
告警服务务
排查服务务
恢复能力
远程日志
Crash
配置中心
APM
问题分发
监控
数据
埋点
舆情
统一降级
异常信息
告警规则
aCon
InfoQ
攻防SDK主要由以下几部分能力组成:配置接收解析、环境感知、注入决策和切面注入。切面注入主要实现了以下几类注入:Java/OC方法注入,Native方法注入、系统注入(CPU、内存、线程等)、请求拦截(篡改请求参数、返回值、请求延时)、日志注入、舆情注入,后续还会进行扩展。
攻防SDK
配置接收
切面注入
注入决策
云端配置
本地配置
页面匹配
配置解析
配置校验
Native方法注入
JAVA/OC注入
类匹配
请求拦截
系统注入
环境感知
方法匹配
舆情注入
日志注入
类/函数
页面
请求匹配
系统状态
日志
lnfoQ
Con
攻防场景配置平台提供了注入配置、演练场景、演练计划的配置,以某个业务为例, 某次计划演练页面异常和无法点击按钮的两个场景, 可以设置注入配置为:请求超时或请求异常,拦截掉点击方法修改其行为。
攻防场景配置平台
注入
演练
演练
场景
计划
配置
请求超时
页面显示
异常
请求异常
首页演练
点击方法
无法点击
按钮
拦截
acon
lnfoQ
攻防中控台提供了演练准备、演练审批、演练执行、演练过程、演练复盘的能力,可以一站式完成全部攻防演练流程。
攻防中控台
BD国第DSO
房族:鱼
族湖量鱼
SAAn
15UE
#1国:A
民国
*量量量055A
Bet08848o1o
acon
InfoQ
TUOO秋OAO
攻防场景的来源主要有以下几类:线上问题, 真实的线上问题和故障是非常好的素材, 同一个问题对相关业务产生第二次攻击,观察该业务在问题发生后的复盘Action是否有效落地是很有意义的。此外也可以进行故障平移,把A业务发生的问题用来攻击B业务。主链路场景, 通过梳理业务的P0P1场景, 对这些场景进行攻击。系统Review,主要是业务或架构专家介入,对现有系统进行review分析,找出薄弱点进行攻击。泛化攻击,通过将某一类问题对不同的场景或业务进行泛化,如对某个业务下所有的方法进行拦截,使之返回空指针或抛出异常。
攻防场景来源
线上问题
主链路场景
攻防
场景
系统Review
泛化攻击
InfoQ
Con
实践落地:手机淘宝的常态化攻防演练
前面的内容主要是介绍原理和技术方案, 攻防演练是一个技术和实践相结合的领域,整个过程需要人的强参与,尤其是红军:业务研发和测试团队。因此我们也进行了一系列的常态化运营实践,主要分为5个方面:理念宣导、培训考试、定期演练、应急数据大盘、团队积分制度,来推动攻防演练在团队落地,发现问题和产生价值。理念宣导和培训考试主要是对业务团队进行定期的培训, 让他们了解攻防演练以及线上问题处理的相关知识,做好理论知识准备。
定期演练是将攻防演练常态化,主要形式有全生命周期演练和专题演练。全生命周期演练有code review攻击(对CR进行问题注入,考察reviewer是否认真进行了review), 变更突袭(在应用或配置发布时发起攻击, 考察发布人是否有进行系统指标的留观), 线上突袭(随时随机对目标业务发起攻击, 综合考察目标业务的应急能力)。专题演练有监控告警专场(只考察监控和告警点是否覆盖全面, 监控告警系统是否有效), 修复专场(考察业务快速修复能力,主要是看修复时间), 业务蓝军专场(由业务测试或业务团队中的成员发起攻击),大促/非工作日专场(考察非工作日情况下的组织应急能力)
定期演练
发布
恢复
告警
研发
响应
定位
全生命
周期演练
变更突袭
CR攻击
线上突袭
修复专场
监控&告警专场
专题演练
大促/非工作日专场
业务蓝军专场
InfoQ
acon
此外还建立了团队积分机制,对每一次的演练按标准进行打分衡量, 定期对团队演练成绩进行排名, 激励业务积极参与,通过数据发现自己应急能力待完善的地方,也会晒出攻防演练中发现的最佳实践供大家学习。
团队积分机制
恢复手段
故摩惊复
附加分
发现手段
故障定位(20)
故障发现(30)
(20)
(15)
(15)
(20)
不依颜发版,有
积分规则
能发现平台块隔
前置预案,可以
主动发现,通过
并提供有效的料
通过服务端配置,
C15分钟
业务自身的告警
单项满分*100%
<5分钟
60分钟
决方案团队或个
开关推送,预案
或监控触发
团队排名
人可获附加分
推送,海级方案
恢复
蚁
本次政防滨绮过
红黑榜
程中故纯发现,
主动发现,通过
故纯定位,故随
单项海分*80%
公共配置告警或
<30分钟
90分钟
10分钟
停复整体时间最
监控晚发
知的团队或个人
攻防之星
可获别加分
单项演分60%
<45分钟
C120分钟
<15分钟
或
最佳实践
在玫防滨鳞之后
单项满分40%
积级梦与复且
<60分钟
c150分钟
L20分钟
提出切实改进
acton并落地的团
需要发布版本才
被动发现,被架
单项滴分20%
90分钟
430分钟
C180分钟
队和个人可获射
可以停复
构团队告知
加分
没有发现
没有恢复手段
无法停复
总分-0%
没有定位到模块
没有发现
acon
InfoQ
应急数据大盘
量化指标,衡量演练价值
通过数据分析,发现问题
通过数据,完善平台
InfoQ
Con
参考文献
- 混沌工程实战:手把手教你实现系统稳定性, 拉斯 • 迈尔斯;
- 混沌工程:Netflix 系统稳定性之道;