Page 119 - 《软件学报》2021年第5期
P. 119
贺祥 等:多版本共存的微服务系统自适应演化方法 1343
DevOps 流程中部署需求.该问题如图 1(b)所示.考虑到 DevOps 是一套完整的快速交付流程,本文仅考虑 DevOps
流程中和服务实例部署相关的操作.
在本文中,我们考虑了有关云边缘环境中多版本共存微服务系统自适应演化的 3 个研究问题(RQ).
RQ1. 如何对微服务之间的版本依赖进行建模?由于每个微服务的版本树都是独立的,版本依赖关系会随时
间变化,因此对于服务系统而言,在运行时对版本依赖关系进行建模至关重要.此外,现有描述微服务
之间调用依赖关系的方法如 SDG 无法应对微服务的快速迭代开发.当微服务发生兼容升级时,调用
该微服务的其他微服务应动态扩展其版本依赖.
RQ2. 如何在考虑版本依的情况下得到最佳演化方案?为了满足不断变化的用户需求,考虑到每个可行的演
化计划都有特定的成本,例如货币成本、服务停机时间等,演化方案需要满足一定的约束条件.同时,
在版本依赖的约束下,应在有限的时间内得到最佳的演化方案.针对 DevOps 流程中的部署需求,需要
在考虑版本依赖的情况下,正确执行相关指令.
RQ3. 如何在版本依赖的约束下自动执行演化方案?由于多版本共存微服务系统的复杂性,该系统应具有自
[6]
适应性 :监视系统的运行时状态、决定何时以及如何演化、自动执行演化方案.在演化过程中,应保
证多版本共存系统中请求路由的正确性,并满足系统中各个微服务实例的版本依赖.此外,为了降低
系统维护的复杂度,需要能够自动化处理用户需求变化以及 DevOps 流程中部署需求,减少人工操作.
本文主要有 3 点贡献.
1) 提出了版本依赖模型(version dependency model,简称 VDM)以解决 RQ1 的版本依赖建模,该模型很好
地解决了迭代部署问题,同时实现了编程框架 Microservice Framework for Microservice System
(MF4MS),通过将版本依赖描述集成到源代码中,可以让系统在部署之前实现服务依赖的自动分析,
并能够让多版本同时部署在系统中.
2) 提出了一系列自适应算法以解决 RQ2.这些算法在不同的应用场景中,面对不同种类的用户需求变
化,在版本依赖的约束条件下,找到近似最优解的演化方案,从而随着用户需求的变化而维持或者提
高 QoS;在处理 DevOps 流程中的部署需求时,能够自动计算依赖关系,并得到演化方案以自动执行
DevOps 流程中部署需求.
[7]
3) 开发了基于 MAPE-K 模型 的微服务系统架构 Microservice Infrastructure for Microservice System
(MI4MS)以解决 RQ3.它采用自控制循环(self-control loop),可以在满足版本依赖的情况下,对不同种
类的用户需求变化进行服务系统的运行时监控、演化方案的生成以及演化方案的自动执行.针对
DevOps 流程中部署需求,能够接收来自开发者的操作指令,在考虑依赖的情况下自动执行相关指令.
通过对现实世界中常见的应用场景的刻画,构建了真实的云边缘环境来进行实验.结果表明:该方法在有着
复杂版本依赖的情况下,针对用户需求变化能够进行自适应演化,并且保持 QoS 稳定;针对 DevOps 流程中的部
署需求,该方法能够正确处理依赖关系并自动执行相关的 DevOps 操作,减轻了系统维护的负担.
本文第 1 节介绍版本依赖模型 VDM 以及自适应系统的设计.第 2 节介绍不同场景下的相关演化算法.第 3
节介绍编程框架和微服务系统架构的具体实现.第 4 节介绍实验设计以及实验结果.第 5 节介绍相关工作.最后
在第 6 节进行总结并探讨未来工作.
1 版本依赖模型与自适应系统设计
1.1 版本依赖模型
考虑到服务依赖关系图只能描述特定版本的微服务的 API 之间的调用依赖关系,不适用于不断变化的服
务依赖关系进行迭代开发,因此我们提出了基于服务依赖关系图的版本依赖关系模型.
定义 1. s=〈I,c,m,v〉服务系统中的服务定义,s∈S,S 是系统中的服务集合,其中,
• I={i 1 ,i 2 ,…,i n },服务 s 提供的功能接口集合.每一个接口都表示为 i = 〈 f ,,l d in ,d out 〉 ,其中,f i 表示服务的
i i i i i