系统成功率99.99%+,美团CI/CD流水线引擎演进实践( 四 )


三、整体架构
系统成功率99.99%+,美团CI/CD流水线引擎演进实践
文章图片
图2流水线架构触发器:作为流水线的触发入口 , 管理多种触发源及触发规则(PullRequest、GitPush、API触发、定时触发等) 。 任务中心:管理流水线构建过程中的运行实例 , 提供流水线运行、中止、重试、组件作业结果上报等操作 。 决策者:对所有等待调度的作业进行决策 , 并将决策结果同步给任务中心 , 由任务中心进行作业状态的变更 。 Worker:负责向任务中心拉取可执行的作业 , 并为作业分配具体的执行资源 。 组件SDK:作为执行组件业务逻辑的壳 , 负责真正调起组件 , 完成组件初始化与状态同步的系统交互 。
四、核心设计点
1、作业调度设计
1)调度过程
下面 , 我们以一个简单的流水线调度示例(源码检出-[并行:代码扫描 , 构建]-部署) , 来介绍调度设计中各模块的协作过程 。
系统成功率99.99%+,美团CI/CD流水线引擎演进实践
文章图片
图3调度过程
大致逻辑如下:
①当触发流水线构建后 , 系统会在任务中心创建该编排所要执行的所有组件作业 。 并且将作业状态的变化以事件方式通知决策者进行决策 。
②决策者接收决策事件 , 根据决策算法计算出可被调度的作业 , 向任务中心提交作业的状态变更请求 。
③任务中心接收决策请求 , 完成作业状态变更(作业状态变更为已决策) , 同时加入相应的等待队列 。
④Worker通过长轮询方式拉取到和自己匹配的等待队列的作业 , 开始执行作业 , 执行完成后将结果上报给任务中心 。
⑤任务中心根据Worker上报的作业执行结果变更作业状态 , 同时向决策者发起下一轮决策 。
⑥以此反复 , 直至流水线下所有作业都已执行完成或出现作业失败的情况 , 对流水线进行最终决策 , 结束本次执行 。
整个过程中 , 任务中心作为一个分布式存储服务 , 统一维护流水线和作业的状态信息 , 以API方式与其他模块进行交互 。 而决策者和Worker通过监听作业状态的变化执行相应的逻辑 。
2)作业状态流转
下面是一个作业完整的状态机 , 我们通过作业决策、拉取、ACK以及结果上报一系列事件 , 最终完成作业从初始状态向完结状态的流转过程 。
状态机在接收某种状态转移的事件(Event)后 , 将当前状态转移至下一个状态(Transition) , 并执行相应的转移动作(Action) 。
系统成功率99.99%+,美团CI/CD流水线引擎演进实践
文章图片
图4状态机
在实际场景中 , 由于调度过程涉及链路长、各环节稳定性无法完全保证 , 容易产生因异常情况导致状态不流转的情况 。 为此 , 在设计上利用数据库保证状态变更的正确性 , 同时为非完结状态作业设立相应的补偿机制 , 确保任一环节异常后作业可以恢复正确流转 。
我们重点从作业决策和作业拉取这两个关键过程来看状态流转过程可能出现的问题 , 以及在设计上是如何解决的 。
①作业决策过程:任务中心接收调度作业的决策 , 将可调度的作业从unstart变为pending状态 , 同时将作业加入等待队列 , 等待被拉取 。
系统成功率99.99%+,美团CI/CD流水线引擎演进实践
文章图片
图5状态机-决策未收到决策事件:由于决策者服务自身的问题或网络原因 , 导致决策事件的请求失败 , 作业长时间处于未调度状态 。
解决方案:引入定时监测的机制 , 对于无过程状态作业且处于未完结状态的流水线进行重新决策 , 避免决策服务短时间异常导致决策失败 。 重复决策:由于网络延迟、消息重试现象可能出现多个决策者同时决策同一个作业 , 产生作业转移的并发问题 。