Page 10 - 《软件学报》2021年第5期
P. 10
1234 Journal of Software 软件学报 Vol.32, No.5, May 2021
提出.与软件/计算机整个领域的现有韧性研究相同,目前绝大部分提到微服务架构韧性的研究仅仅提到了韧性
的概念,并基本以现有韧性机制(如负载均衡、熔断机制等)的优化研究为主,包括微服务的健康管理 [26] 、负载均
衡 [27] 、故障恢复机制 [28] 、故障发现等 [29] .也有少数针对微服务韧性展开的相关理论研究.Heorhiadi 等人提出了
一种微服务架构的韧性测试框架 [30] ;Thomas 和 Andre 提出了用于微服务架构性能和韧性基线分析的元模型 [31] ,
Giedrimas 根据现有的韧性机制总结了微服务架构韧性设计中需要考虑的几个方面 [32] ,Andre 和 Aleti 提出了一
种结合了工作负载和故障注入的微服务架构韧性基线验证框架 [33] ,Michal 和 Marian 比较了单体应用和微服务
架构之间在性能和韧性之间的差异 [34] .然而,现有微服务韧性的研究中并未有从软件风险角度讨论韧性的研究.
软件风险评估(software risk evaluation)是软件工程中的重要过程之一,其中,软件风险识别是软件风险评估
过程中的首要步骤 [35] .主流的软件风险评估方法有故障树分析法(fault tree analysis) [36] 、错误用例法(misuse
case) [37] 、威胁建模(threat modeling) [38] 以及 FMEA 法 [39] .上述的评估方法在软件风险识别阶段均使用人为方法
识别软件风险,通过参考专家经验以及类似的历史项目或者头脑风暴来列出可能威胁软件本身以及软件开发
过程中潜在的风险.其中,威胁建模在风险识别阶段引入了 STRIDE 模型 [38] ,通过枚举不同的风险类型启发风险
分析人员找到软件项目的潜在风险.近年来,对软件风险导出方法的研究也主要以针对不同领域软件的优化为
主,软件风险的识别仍然使用人为方法 [40,41] .
混沌工程 [42] 是由 Netflix 公司于 2017 年提出的一种用于验证微服务系统对故障应对能力的实验方法.通过
随机地对目标系统进行故障注入,观察系统服务是否被故障影响.Netflix 针对自身的应用的关键服务——视频
播放服务,以每秒视频的启动次数(video-stream start per second,简称 SPS)作为度量指标,通过观察故障注入后
视频播放服务的 SPS 值是否会低于指定阈值,判断注入的故障是否为潜在系统风险.目前,在计算机领域有关混
沌工程的学术研究极少,在 SCI、EI、DBLP 等数据库中对“Chaos Engineering”一词进行检索,仅能搜索到少量
与 Netflix 提出的混沌工程概念一致的相关文献.在提出混沌工程的概念后,Netflix 又针对混沌工程的商业价
值 [43] 、测试平台 [44] 及混沌实验的执行过程 [45] 进行了进一步阐述.Zhang 等人针对 Java 虚拟机提出了
ChaosMachine 框架 [46] ,该框架能够在混沌实验的过程中.通过添加 Java 注释的方式实现在 Java 代码中插入异常
(exception)抛出行为,以验证 Java 服务捕获并处理异常的能力.Jesper 等人针对容器环境提出了 ChaosOrca 框
架 [47] ,实现了对部署微服务环境的容器的系统调用进行故障注入.Kennedy 等人利用混沌工程的方法随机地对
云服务进行安全性攻击,以发现云服务中的数据安全问题.目前,混沌工程已被业界认可为一种可实践的方法
论 [48−50] ,并已有一些可用于实践的工具,如 Netflix 的 ChaosMonkey、阿里巴巴的 Chaosblade、混沌工程服务
Gremlin 以及开源项目 Chaos-toolkit 等.这些工具目前的主要功能为实现特定的系统环境扰动,并提供对应混沌
实验文件模板或指令给测试人员,而有关混沌实验的具体设计过程并没有相关实现.本文的案例研究中,也将利
用上述工具实现的系统环境扰动发现目标系统潜在的韧性风险.
故障诊断是用于分析软件风险对软件系统影响的一种重要方法.现有针对分布式服务架构的软件系统的
故障诊断方法可以分为基于监督学习的方法和基于系统调用关系的方法.
• 基于监督学习的方法 [51−54] 需要在一个已标签过的数据集上进行机器学习模型的训练,训练后的模型
能够判断当前系统中是否存在某一种类型的异常.目前,基于监督学习的故障诊断方法需要大量收集
系统的历史数据,并且通常仅能判断目标系统是否存在某一特定类型的故障.
• 基于系统调用关系的方法将首先构建出系统服务和系统资源之间的依赖关系图,并根据依赖关系定
位系统故障的根因.其中,系统服务和资源的依赖关系通常参考已有的经验知识 [55−58] ,或者通过在代码
中插桩获取服务或组件之间调用关系 [59−62] .这一过程需要人工识别服务和资源之间的依赖关系或者
在现有系统上开发特定的工具捕获依赖关系.
为了能 够仅通过系 统性能数据 构建出微服 务架构系 统的依赖关 系图 , 陈鹏飞 等人先后提 出 了
CloudRanger [63] 、Microscope [64] 、CauseInfer [65] 这 3 种根因诊断模型.上述 3 种模型均使用了因果搜索算法分析
目标微服务系统的系统资源和服务之间的因果关系并构建因果关系图,且通过实验证明了因果搜索算法在对
微服务系统的故障诊断上相对于现有故障诊断方法在准确率和效率上具有显著的优势,且无需对系统性能数