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


2、资源池划分设计
1)整体方案
我们采用多队列的设计 , 结合标签建立作业队列与资源池的匹配关系 , 以保障不同队列资源的有效划分 , 在出现队列积压、资源池故障、无可扩资源等情况时 , 最大限度地降低影响范围 , 避免所有作业全局排队等待的现象 。
系统成功率99.99%+,美团CI/CD流水线引擎演进实践
文章图片
图9资源池架构
2)模型关系
系统成功率99.99%+,美团CI/CD流水线引擎演进实践
文章图片
图10资源池模型对象
①作业队列与标签的关系:队列与标签采用1对1的关系 , 降低业务理解和运维成本 。 当队列积压时 , 能快速定位到某个标签没资源了 。 标签资源不足时 , 也能快速判断影响的具体队列情况 。
②标签与资源池的关系:标签和资源池采用多对多的关系 , 主要从资源整体利用率和对核心队列的资源可用性保障考虑 。 对于一些作业量较少的队列 , 单独分配一个资源池会造成大部分时间资源是空闲状态 , 资源利用率低 。 我们通过给资源池打多标签的方式 , 既保证了队列有一定的资源配额 , 同时也能处理其他标签的作业 , 提高资源的利用率 。 对于核心场景的队列 , 通常标签资源会分配到多个资源池上 , 保证资源的一定冗余 , 同时也降低单个资源池整体故障带来的影响 。
3)标签设计
标签的目的是建立资源(池)与作业(队列)的匹配关系 。 在设计上 , 为便于标签管理和后期维护 , 我们采用二维标签的形式 , 通过组件和流水线两个维度 , 共同决定一个作业所属标签及对应的资源 。 第一维度:组件维度 , 对资源做通用划分 。 结合组件的业务覆盖情况、作业执行量、对机器和环境的特殊要求(如SSD、Dev环境等) , 对需要独立资源的组件进行打标 , 划分出不同的公共资源池(每个公共资源池执行一类或多类组件作业) , 在引擎层面统一分配 , 保证所有作业都有可正常运行 。 第二维度:流水线维度 , 根据业务场景进行划分 。 结合业务对资源隔离/作业积压敏感度的诉求 , 按需进行划分 。 有些希望资源完全独立的业务 , 会从所有的公共资源池进行切分;有些仅对部分核心场景下的资源需要保障 , 根据链路上涉及的组件 , 选择性地从部分公共资源池进行划分 , 实现业务隔离和资源利用率的平衡 。
注:每个维度都会设一个other的默认值用来兜底 , 用于处理无资源划分需求的场景 。
系统成功率99.99%+,美团CI/CD流水线引擎演进实践
文章图片
图11标签设计
4)队列拆分设计
根据作业所属标签不同拆分出多个队列 , 保证每个队列的独立性 , 降低作业积压的影响范围 。 整个拆分过程可以分为入队和出队两部分:入队过程:通过计算作业在组件和流水线两个维度的属性值 , 来确定作业对应的标签 。 结合模型关系中标签与队列(1对1)的关系 , 为每个标签按需创建一个队列 , 存储该标签作业 , 不同队列间作业做排他处理 , 简化出队的实现复杂度 。 出队过程:队列拆分后 , 因为标签和资源池(多对多)的关系 , 资源池的一次作业拉取请求往往会涉及多个队列 。 出于拉取效率的考虑 , 采用轮询的方式依次对单队列进行出队操作 , 直到达到该次请求的作业数上限或所有可选队列为空时返回结果 。 该方式可以避免同时对多个队列加锁 , 并且在前置环节会对多标签进行随机排序 , 降低多个请求同时操作一个队列的竞争概率 。
系统成功率99.99%+,美团CI/CD流水线引擎演进实践