Qcon演讲实录|手机淘宝客户端的攻防演练实践

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 混沌工程是一个业界比较流行的防范系统性风险的方法论, 其核心思想是通过不断地失败来避免失败,以主动制造故障的方法来宏观地验证业务的容灾和恢复能力。这一概念在服务端存在大量的实践和落地, 在客户端还是属于探索阶段,业界甚少甚至没有类似尝试。手机淘宝等大型应用其实是一个广义概念上的分布式系统, 混沌工程理念是否也可以在这类型广义分布式系统上产生价值呢?答案是肯定的,本次分享将向大家介绍手机淘宝客户端是如何使用攻防演练来降低客户端系统风险、提高快速交付能力的。

问题背景:大型APP质量保障困境



之前手机淘宝客户端的研发质量保障体系大致如下, 研发期会进行需求管控、代码扫描、单元测试、UI测试、性能、稳定性等专项测试、适配回归等保证集成质量。发布期会对要发布产物进行一系列的发布卡口检查,如包产物校验、高可用检查、功能回归检查、适配确认等,还会通过灰度发布来进行更多系统、机型、用户场景的覆盖, 补充覆盖到线下测试无法覆盖到的盲区, 期间收集相关的稳定性、高可用问题、舆情体验问题,修复完成后才会进行正式发布。 此外对于大促版本,还会对大促相关活动进行发版前的提前验收,以确保不会有大促态下的叠加问题。 到了版本发布完成后的运维期, 主要是进行监控、告警处理、问题定位、问题恢复等线上运维活动。当我们做完这些质量保障工作,会发现线上问题仍然存在, 有时甚至会有严重的故障。


image.png

研发质量管控体系

发布期

运维期

研发期

监控&告警

发布卡口

代码扫描

需求管控

回滚降级

专项测试

灰度发布

单元测试

大促验收

开关

适配回归

UI自动化

做好了每一个环节,可线上仍有故障!

lnfoQ

acon


类似手机淘宝这样的大型APP可能都会遇到类似的质量保障困境, 究其原因, 还是由于大型APP自身的系统特性及发布节奏所决定的:


  • 一方面, 由于互联网产品迭代速度快, 客户端版本往往一月已发布,甚至每周一发布,在有限的时间内,考虑到ROI, 会主要去保障主链路和重点场景, 一些长尾场景可能被遗漏;
  • 另一方面, 由于动态化因素众多导致发布前的线下及灰度测试是不可能覆盖全面所有的场景,发现全部的问题;
  • 业务多、模块多:依赖复杂, 模块相互之间的影响是黑盒的、混沌的;
  • 二方、三方生态繁荣:开发者不仅来自手淘内部,也有集团还有外部研发者, 已经建立了相关的准入机制,但难免有不可控和遗漏的部分;
  • 变更多、发布多:服务端、前端、配置、Push推送, 以及营销活动等都可能对端侧代码路径造成影响;


image.png

大型APP的质量保障困境

业务多,模块多

G6O

18:81808

直播

详情

购物车

消息

首页

二方,三方生态繁荣

商家群

店铺

品牌号

小程序

55:5

变更多,发布多

前端页面

配置推送

Push推送

服务端应用

acon

lnfoQ


还有一个很重要的因素——外部不可控因素。线下测试可以覆盖全面用户使用的真实设备和操作系统版本。客户端应用的体验会受到操作系统和手机厂商的影响, 由于系统和手机厂商经常会有升级更新, APP研发人员需要紧跟其脚步,每次苹果或者Android系统升级都可能带来一些不可预期的问题。




解决思路:基于混沌工程建设客户端攻防演练


介于前面介绍的事实,我们会发现一个悲观的事实, 在发布前发现所有的问题是不可能的。我们可以做的是:1. 减少意外问题发生的可能性;2. 降低问题发生时带来的影响。服务端分布式系统较多,应对未知问题的经验比较多,客户端可以借鉴。


混沌工程是近年来服务端分布式架构应对未知风险的其中一项比较热门的实践。“混沌工程原则”网站给出了下面的定义——混沌工程是一门对系统进行实验的学科,旨在了解系统应对生产环境的各种混乱状况的能力,建立对系统的信心。攻防演练是混沌工程的一个子集, 通过沉淀通用的故障模式,以可控成本在线上进行重放, 以持续性的演练和回归方式来暴露问题, 不断推动系统、工具、流程、人员能力的不断演进。


image.png

混沌工程:是一门对系统进行实验的学科,旨

在了解系统应对生产环境的各种混乱状况的能

力,建立对系统的信心

攻防演练:目标是沉淀通用的故障模式,以可

控成本在线上重放,以持续性的演练和回归方式

运营来暴露问题,不断推动系统,工具,流程,

人员能力的不断前进

lnfoQ

Con


客户端作为一个广义意义上的分布式系统, 因此也可以参考混沌工程的理念来提升其健壮性,降低故障发生的风险。经过评估,我们发现攻防演练可以一定程度补充和完善客户端质量保障的能力。


  • 面向失败设计:为了避免失败去提前往系统注入失败并想好应对规避策略以及预案;
  • 验证链路高可用:通过故障注入,去验收证明全链路的高可用性, 包括监控、告警、定位、恢复体系;
  • 提升应急能力:通过故障演练, 提升研发团队应对线上问题时的应急能力;


image.png

如何解决系统性风险

验证链路

高可用

提升应急

面向失败

能力

设计

混沌

工程

InfoQ

Con


此外, 攻防演练对项目其他角色也具有一定的意义:


  • 对于架构&研发, 在架构和技术方案设计时,可以设想在不同场景下可能导致系统失败的各种因素,并在方案中对失败进行预防处理;
  • 对于研发&运维, 可以在发生问题时及时找到提前设计好的恢复预案进行操作, 达到快速恢复的目的。同时通过类线上环境的故障演练, 可以提高应急能力;
  • 对于产品&设计, 可以对系统出现异常情况下的产品体验做出优化, 并验收产品;
  • 对于支撑&平台,能够对监控、告警、定位、恢复的线上运维全链路系统进行验收, 并且发现薄弱点加以改进;

image.png

对各角色的意义

架构&研发:

研发&运维:

风险识别

提高应急能力

面向失败设计

快速恢复

产品&设计

支撑&平台:

验收全链路系统

验收产品

优化异常体验

发现薄弱点

lnfoQ

Con


从研发全生命周期来看,研发到线上运维各阶段都可以进行攻防演练。


image.png

对研发流程的意义

告警

恢复

发布

研发

定位

响应

CR有效性

分发效率

灰度有效性

开关实时性

故障覆盖度

定位能力

开关到达率

发布规范

响应效率

排查能力

预案设计

监控有效性

acon

InfoQ



具体方案:客户端攻防演练实施原则及体系


实施混沌工程有5大原则:第一是建立一个围绕稳定状态行为的假说, 需要定义一系列能够描述系统处于稳定状态的相关指标,服务端可以是请求成功率、RT等,客户端则是另一套指标,后文会继续介绍。第二是多样化真实世界的事件, 能够覆盖全面真实世界中的各类事件。第三是在生产环境中运行实验,这样得到的实验结果才是最贴近真实情况的,实验环境往往不被大家所信任,为了屏蔽不必要的影响(实验环境数据不同,配置不同导致差异等),应该尽量在真实的生产环境中进行混沌工程实验。第四是持续自动化运行实验, 混沌工程本身应该是一个持续迭代的过程,通过混沌工程发现的问题,得到修复后希望可以加以验证。如果该过程不是自动化可持续进行的,会导致实施成本太高, 难以常态化进行。第五是最小化爆炸半径,因为混沌工程是有损的,会对系统造成一定的影响, 所以希望不会因为实验对真实用户体验带来伤害,最好能将其影响面控制到一定的范围内,可以随时终止。


image.png

混沌工程及其实施原则

建立一个围绕稳定状态行为的假说

多样化真实世界的事件

在可控范围内对

在生产环境中运行实验

系统注入故障

持续自动化运行实验

最小化爆炸半径

InfoQ

con


从混沌工程的5大原则,我们可以结合客户端特点总结出客户端攻防演练的5大原则:符合客户端特点的稳定状态假说, 全面覆盖客户端故障类型,在生产环境但不影响真实用户, 可持续开展,过程可度量。


image.png

客户端攻防演练原则

稳定状态

假说

过程可度

全面覆盖

故障类型

不影响真

可持续开

实用户

lnfoQ

Con


第一个实施原则是需要定义出客户端的稳定状态假说, 可以分为以下4个具有客户端特色的领域:第一是稳定性指标,包括Crash率、ANR率等, 第二是性能或高可用指标, 包括客户端内存、CPU、FPS等性能指标, 以及性能问题如主线程卡顿、内存泄露等。第三是功能指标, 和业务特性强相关, 各类业务指标、异常埋点等,如页面打开成功率、视频播放成功率等。第四是体验指标, 如启动时间、页面响应时长、白屏率等。


image.png

客户端稳定状态假说

性能

稳定性

Crash,ANR/Abort

内存,CPU.主线程卡顿...

体验

功能

具有业务特性,异常埋点,业务指标等

启动时间,页面响应时间

aCon

InfoQ

BUOOOOAO


第二个实施原则是要全面覆盖客户端故障类型。市面上大部分混动实验工具都是服务端的,主要是系统、应用、容器等实验场景。客户端也可以参考类似思路,将客户端的故障类型分层梳理出来。这里我们把客户端故障类型氛围了三层, 系统层、中间件层和业务层, 各层次对应的故障类型如下图所示:


image.png

全面覆盖客户端故障类型

消息

首页

直播

购物车

下单

业务层

功能异常

卡顿/耗电

点击无效

崩溃闪退

页面白屏/异常

覆盖客户端各

基础服务

JS异常

跳转拦截

配置中心异常

容器异常

层次可能发生

的故障点

请求超时

中间件

请求失败

请求不可访问

请求异常

网络层

数据库读失败

缓存读失败

数据层

缓存写失败

数据库写失败

系统层

CPU过高

内存过高

线程池满

磁盘空间满

系统API异常

lnfoQ

Con

   

第三个实施原则是尽量真实但又不能影响真实用户,这个原则要求比较矛盾, 如果要尽量贴近真实,那么大概率会使用真实环境, 不可避免的影响到真实用户。客户端相较服务端有一个特点:只有通过应用市场和自有渠道发布出去的正式包才会影响真实用户,如果打出和正式包相同代码的测试包注入问题在线下进行攻防演练,是不会对真实用户造成实际影响的。因此我们采取的方案是通过在真机实验室安装特殊的APP包来隔离线上环境,通过自动化去不断的触发这些故障场景。监控数据上报到服务端后,对相关数据加以放大,使之能达到故障或问题的告警门限,触发线上问题。同时这些监控数据也被打上了特殊标记,避免污染真实数据。


image.png

不影响真实用户

线上环境

实验室环境

真机实验室+特殊应用包

数据

体验

异常

lnfoQ

COn


第四个实施原则是可持续开展, 这里主要是通过场景自动化和配置沉淀复用实现的。场景自动化是把故障场景通过自动化脚本的方式沉淀下来, 可以通过自动化反复在真机实验室触发。配置沉淀复用是指把注入配置、攻击场景、计划进行分层,不同层次的配置可以重复组合使用,达到降低攻防演练准备成本的目的。


image.png

可持续开展

场景自动化

真机实验室

触发脚本

演练计划

逻辑分层

攻击场景

沉淀复用

注入配置

lnfoQ

acon


第五个实施原则是过程可度量, 攻防演练需要对参与的红军进行量化的评估,因此我们将线上问题应急的过程进行了划分,定义了以下几个阶段:问题发生(问题实际发生的时间), 问题上报(问题通过数据通道上报到监控系统的时间),问题发现(达到问题门限,触发告警时的时间), 问题响应(相关业务收到告警上线处理问题的时间), 问题定位(相关业务定位到问题原因的时间), 问题处理(开始实施恢复手段的时间), 问题恢复(系统真正恢复到正常状态的时间)。我们与监控系统、告警系统、问题处理响应系统进行了打通,采集了这些关键节点的数据,用于演练后的过程度量。


image.png

过程可度量

问题上报

问题响应

问题恢复

问题定位

问题处理

问题发生

问题发现

发现时长

响应时长

定位时长

止血时长

恢复时长

lnfoQ

Con


上面介绍了客户端攻防演练的实施原则, 下面将介绍下具体的实现方案。可能的实现方案主要有以下4种,围绕他们的使用成本、场景覆盖和真实性进行了分析, 最终选定了端侧SDK+注入配置的方案。

image.png

实现方案比较

方案

使用成本

真实性

场景覆盖

高中中低

高全较真实

代码修改

部分

中中

服务端注入

部分

日志注入

端侧SDK+注

较真实

较全

入配置


下面是客户端攻防演练的整体方案,分为蓝军和红军两方。蓝军主要由安全生产小组、架构专家、业务专家组成,主要目标是通过攻击工具对业务发起攻击。红军主要由业务开发和测试同学组成, 主要目标是在攻击发生时,使用发现、定位、恢复工具对故障进行快速响应和恢复。


image.png

整体方案

攻击业务

红军

发现响应恢复

PO级:首页交易详情店铺

安全生产小组

攻击

P1级:导购微淘消息我的淘宝

业务开发

防守

startTime

架构,业务专家

recoveryTime

业务测试

客户端

环境:

手淘测试真机隔离环境

攻击

发现

工具

攻击注入

攻击发起

系统

工具

亚务

中间件

业务告警

Crash告警

攻击类型

定位工具

支付:付不了款

详情:领不了券

交易:下

业务

首页:

服务端日志

Tlog

舆情日志

Crash日志

不了单

点击无法跳转

恢复手段

中间件

定位

埋点

网络库

webview

weex

图片库配营库

小程序

基础

容器

核心

系统

开关

数据降级

服务端降级

预案

写入

读取

高内存高存储

域名拦载

限流

高CPU

CDN

失败

失败

不可用

性能

存储

网络

aCon

InfoQ

全球软件开发大会


下面这张图是攻防演练平台的总体架构, 最核心的部分是攻防演练配置中控台,以及注入SDK。蓝军通过配置中控台进行演练场景的配置, 该配置通过配置下发通道下发, 端侧SDK收到配置后进行解析和注入。


image.png

总体架构

攻防演练配置&中控

配置下发通道

数据采集服务

攻防演练

平台

服务端注入

客户端注入SDK

前端端注入SDK

打包平台

真机实验室

过程数据收集

数据上报通道

数据放

数据埋点

应用回滚

问题通知

告警服务务

排查服务务

恢复能力

远程日志

Crash

配置中心

APM

问题分发

监控

数据

埋点

舆情

统一降级

异常信息

告警规则

aCon

InfoQ


攻防SDK主要由以下几部分能力组成:配置接收解析、环境感知、注入决策和切面注入。切面注入主要实现了以下几类注入:Java/OC方法注入,Native方法注入、系统注入(CPU、内存、线程等)、请求拦截(篡改请求参数、返回值、请求延时)、日志注入、舆情注入,后续还会进行扩展。


image.png

攻防SDK

配置接收

切面注入

注入决策

云端配置

本地配置

页面匹配

配置解析

配置校验

Native方法注入

JAVA/OC注入

类匹配

请求拦截

系统注入

环境感知

方法匹配

舆情注入

日志注入

类/函数

页面

请求匹配

系统状态

日志

lnfoQ

Con


攻防场景配置平台提供了注入配置、演练场景、演练计划的配置,以某个业务为例, 某次计划演练页面异常和无法点击按钮的两个场景, 可以设置注入配置为:请求超时或请求异常,拦截掉点击方法修改其行为。


image.png

攻防场景配置平台

注入

演练

演练

场景

计划

配置

请求超时

页面显示

异常

请求异常

首页演练

点击方法

无法点击

按钮

拦截

acon

lnfoQ


攻防中控台提供了演练准备、演练审批、演练执行、演练过程、演练复盘的能力,可以一站式完成全部攻防演练流程。


image.png

攻防中控台

BD国第DSO

房族:鱼

族湖量鱼

SAAn

15UE

#1国:A

民国

*量量量055A

Bet08848o1o

acon

InfoQ

TUOO秋OAO


攻防场景的来源主要有以下几类:线上问题, 真实的线上问题和故障是非常好的素材, 同一个问题对相关业务产生第二次攻击,观察该业务在问题发生后的复盘Action是否有效落地是很有意义的。此外也可以进行故障平移,把A业务发生的问题用来攻击B业务。主链路场景, 通过梳理业务的P0P1场景, 对这些场景进行攻击。系统Review,主要是业务或架构专家介入,对现有系统进行review分析,找出薄弱点进行攻击。泛化攻击,通过将某一类问题对不同的场景或业务进行泛化,如对某个业务下所有的方法进行拦截,使之返回空指针或抛出异常。


image.png

攻防场景来源

线上问题

主链路场景

攻防

场景

系统Review

泛化攻击

InfoQ

Con



实践落地:手机淘宝的常态化攻防演练


前面的内容主要是介绍原理和技术方案, 攻防演练是一个技术和实践相结合的领域,整个过程需要人的强参与,尤其是红军:业务研发和测试团队。因此我们也进行了一系列的常态化运营实践,主要分为5个方面:理念宣导、培训考试、定期演练、应急数据大盘、团队积分制度,来推动攻防演练在团队落地,发现问题和产生价值。理念宣导和培训考试主要是对业务团队进行定期的培训, 让他们了解攻防演练以及线上问题处理的相关知识,做好理论知识准备。


image.png

实践落地

理念宣导

培训考试

定期演练

应急数据大盘

团队积分制度

InfoQ

Con


定期演练是将攻防演练常态化,主要形式有全生命周期演练和专题演练。全生命周期演练有code review攻击(对CR进行问题注入,考察reviewer是否认真进行了review), 变更突袭(在应用或配置发布时发起攻击, 考察发布人是否有进行系统指标的留观), 线上突袭(随时随机对目标业务发起攻击, 综合考察目标业务的应急能力)。专题演练有监控告警专场(只考察监控和告警点是否覆盖全面, 监控告警系统是否有效), 修复专场(考察业务快速修复能力,主要是看修复时间), 业务蓝军专场(由业务测试或业务团队中的成员发起攻击),大促/非工作日专场(考察非工作日情况下的组织应急能力)


image.png

定期演练

发布

恢复

告警

研发

响应

定位

全生命

周期演练

变更突袭

CR攻击

线上突袭

修复专场

监控&告警专场

专题演练

大促/非工作日专场

业务蓝军专场

InfoQ

acon


此外还建立了团队积分机制,对每一次的演练按标准进行打分衡量, 定期对团队演练成绩进行排名, 激励业务积极参与,通过数据发现自己应急能力待完善的地方,也会晒出攻防演练中发现的最佳实践供大家学习。


image.png

团队积分机制

恢复手段

故摩惊复

附加分

发现手段

故障定位(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

image.png

应急数据大盘

量化指标,衡量演练价值

通过数据分析,发现问题

通过数据,完善平台

InfoQ

Con


参考文献

  • 混沌工程实战:手把手教你实现系统稳定性, 拉斯 • 迈尔斯;
  • 混沌工程:Netflix 系统稳定性之道;
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
安全 关系型数据库 测试技术
基于智能手机的医院服务客户端设计与实现(论文+源码)_kaic
基于智能手机的医院服务客户端设计与实现(论文+源码)_kaic
|
11天前
|
存储 移动开发 JavaScript
html5手机Web单页应用实践--起点移动阅读
html5手机Web单页应用实践--起点移动阅读
|
3月前
|
安全 关系型数据库 测试技术
基于智能手机的医院服务客户端设计与实现_kaic
基于智能手机的医院服务客户端设计与实现_kaic
|
12月前
|
编解码 大数据 测试技术
客户端性能测试中我们如何选择手机
客户端性能测试中我们如何选择手机
|
3月前
|
编解码 监控 定位技术
抖音技术分享:抖音Android端手机功耗问题的全面分析和详细优化实践
本文结合抖音的功耗优化实践中产出了一些实验结论,优化思路,从功耗的基础知识,功耗组成,功耗分析,功耗优化等几个方面,对 Android 应用的功耗优化做一个总结沉淀。
293 0
|
存储 网络安全 数据安全/隐私保护
iOS 逆向编程(八)远程拷贝 - 客户端(电脑)通过 ssh 拷贝文件到服务端(手机)
iOS 逆向编程(八)远程拷贝 - 客户端(电脑)通过 ssh 拷贝文件到服务端(手机)
116 0
|
存储 网络安全 数据安全/隐私保护
iOS 逆向编程(七)客户端(手机)免密认证登录
iOS 逆向编程(七)客户端(手机)免密认证登录
119 0
|
移动开发 weex 容器
《手机淘宝H5和Weex容器的构建实践》电子版地址
手机淘宝H5和Weex容器的构建实践
106 0
《手机淘宝H5和Weex容器的构建实践》电子版地址
|
运维 前端开发 调度
|
存储 缓存 负载均衡
vivo手机上的系统级消息推送平台的架构设计实践
本文将要分享的是手机厂商vivo的系统级推送平台在架构设计上的技术实践和总结。这也是目前为止首次由手机厂商分享的自建系统级推送平台的技术细节,我们也得以借此机会一窥厂商ROOM级推送通道的技术水准。
340 0
vivo手机上的系统级消息推送平台的架构设计实践