Dispatch 构建调度模块架构指南
模块定位: Dispatch 是 BK-CI 的构建调度模块,负责接收流水线的构建任务,将任务分发到合适的构建机(第三方构建机、Docker 容器、Kubernetes Pod)上执行。
一、模块整体结构 1.1 子模块划分 src/backend/ci/core/dispatch/ ├── api-dispatch/ # API 接口定义层 │ └── src/main/kotlin/com/tencent/devops/dispatch/ │ ├── api/ # REST API 接口 │ ├── constants/ # 常量定义 │ └── pojo/ # 数据对象 │ ├── enums/ # 枚举 │ ├── redis/ # Redis 数据结构 │ └── thirdpartyagent/ # 第三方构建机相关 │ ├── api-dispatch-docker/ # Docker 调度 API ├── api-dispatch-kubernetes/ # Kubernetes 调度 API │ ├── biz-dispatch/ # 业务逻辑层 │ └── src/main/kotlin/com/tencent/devops/dispatch/ │ ├── configuration/ # 配置类 │ ├── controller/ # API 实现 │ ├── cron/ # 定时任务 │ ├── dao/ # 数据访问层 │ ├── exception/ # 异常定义 │ ├── listener/ # 消息监听 │ ├── service/ # 业务服务 │ │ ├── jobquota/ # 作业配额服务 │ │ └── tpaqueue/ # 第三方构建机队列 │ └── utils/ # 工具类 │ ├── biz-dispatch-docker/ # Docker 调度业务 ├── biz-dispatch-kubernetes/ # Kubernetes 调度业务 ├── common-dispatch-kubernetes/ # Kubernetes 通用组件 ├── model-dispatch/ # 数据模型层 └── boot-dispatch/ # Spring Boot 启动模块
1.2 调度类型 类型 说明 实现模块 第三方构建机 用户自有构建机 biz-dispatch Docker 构建机 公共 Docker 容器 biz-dispatch-docker Kubernetes K8s Pod 构建 biz-dispatch-kubernetes 二、核心概念 2.1 构建任务状态 enum class PipelineTaskStatus(val status: Int) { QUEUE(0), // 排队中 RUNNING(1), // 运行中 DONE(2), // 已完成 FAILURE(3), // 失败 CANCEL(4), // 取消 }
2.2 构建机类型 enum class JobQuotaVmType(val type: String) { DOCKER("DOCKER"), // Docker 构建机 THIRD_PARTY_AGENT("THIRD_PARTY"), // 第三方构建机 KUBERNETES("KUBERNETES"), // K8s 构建机 AGENTLESS("AGENTLESS"), // 无编译环境 }
2.3 第三方构建机任务类型 enum class BuildJobType(val type: String) { ALL("ALL"), // 所有类型 DOCKER("DOCKER"), // Docker 构建 BINARY("BINARY"), // 二进制构建 }
三、核心数据库表 3.1 调度记录表 表名 说明 核心字段 T_DISPATCH_PIPELINE_BUILD 流水线构建调度记录 PROJECT_ID, PIPELINE_ID, BUILD_ID, VM_SEQ_ID, STATUS T_DISPATCH_THIRDPARTY_AGENT_BUILD 第三方构建机任务 PROJECT_ID, AGENT_ID, BUILD_ID, STATUS, WORKSPACE T_DISPATCH_PIPELINE_DOCKER_BUILD Docker 构建任务 BUILD_ID, VM_SEQ_ID, STATUS, DOCKER_IP, CONTAINER_ID T_DISPATCH_PIPELINE_DOCKER_TASK Docker 任务详情 PROJECT_ID, AGENT_ID, IMAGE_NAME, STATUS 3.2 配额管理表 表名 说明 核心字段 T_DISPATCH_QUOTA_PROJECT 项目配额 PROJECT_ID, VM_TYPE, RUNNING_JOBS_MAX, RUNNING_TIME_PROJECT_MAX T_DISPATCH_QUOTA_SYSTEM 系统配额 VM_TYPE, RUNNING_JOBS_MAX_SYSTEM, RUNNING_TIME_JOB_MAX T_DISPATCH_RUNNING_JOBS 运行中的任务 PROJECT_ID, VM_TYPE, BUILD_ID, AGENT_START_TIME 3.3 队列管理表 表名 说明 T_DISPATCH_THIRDPARTY_AGENT_QUEUE 第三方构建机任务队列 T_DISPATCH_PIPELINE_DOCKER_DEBUG Docker 调试会话 3.4 字段说明
⚠️ 重要: PROJECT_ID 是 T_PROJECT.english_name
四、分层架构 ┌─────────────────────────────────────────────────────────────────────────┐ │ Process 模块 │ │ (流水线引擎发起调度请求) │ └─────────────────────────────────────────────────────────────────────────┘ │ ▼ (MQ 消息) ┌─────────────────────────────────────────────────────────────────────────┐ │ Dispatch 模块 │ ├─────────────────────────────────────────────────────────────────────────┤ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ 消息监听层 (listener/) │ │ │ │ ThirdPartyBuildListener - 第三方构建机任务监听 │ │ │ │ TPAQueueListener - 第三方构建机队列监听 │ │ │ │ TPAMonitorListener - 第三方构建机监控监听 │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ 核心服务层 (service/) │ │ │ │ ThirdPartyDispatchService (45KB) - 第三方构建机调度核心 │ │ │ │ ThirdPartyAgentService (38KB) - 第三方构建机管理 │ │ │ │ TPAQueueService - 任务队列服务 │ │ │ │ TPAEnvQueueService - 环境队列服务 │ │ │ │ JobQuotaManagerService - 配额管理服务 │ │ │ │ AuthBuildService - 构建认证服务 │ │ │ └──────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ┌──────────────────────────────────────────────────────────────────┐ │ │ │ DAO 层 (dao/) │ │ │ │ ThirdPartyAgentBuildDao (17KB) - 第三方构建任务访问 │ │ │ │ RunningJobsDao - 运行任务访问 │ │ │ │ JobQuotaProjectDao - 项目配额访问 │ │ │ │ TPAQueueDao - 队列访问 │ │ │ └──────────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────┐ │ 构建机 (Agent) │ │ (第三方构建机 / Docker / K8s) │ └─────────────────────────────────────────────────────────────────────────┘
五、核心类速查 5.1 API 接口层 类名 路径前缀 职责 BuildAgentBuildResource /build/agent 构建机与调度服务交互 ServiceAgentResource /service/agent 服务间构建机操作 ServiceDispatchJobResource /service/dispatch/job 服务间任务调度 OpJobQuotaProjectResource /op/quota/project 运维项目配额管理 OpJobQuotaSystemResource /op/quota/system 运维系统配额管理 ExternalAuthBuildResource /external/auth 外部构建认证 5.2 Service 层 类名 文件大小 职责 ThirdPartyDispatchService 45KB 第三方构建机调度核心(最大) ThirdPartyAgentService 38KB 第三方构建机管理 TPAEnvQueueService 23KB 环境队列服务 JobQuotaBusinessService 14KB 配额业务服务 TPAQueueService 13KB 任务队列服务 TPASingleQueueService 13KB 单队列服务 ThirdPartyAgentMonitorService 13KB 构建机监控 ThirdPartyAgentDockerService 13KB Docker 构建服务 5.3 DAO 层 类名 文件大小 职责 ThirdPartyAgentBuildDao 17KB 第三方构建任务访问 RunningJobsDao 8KB 运行任务访问 TPAQueueDao 6KB 队列访问 DispatchPipelineBuildDao 5KB 流水线构建访问 JobQuotaSystemDao 5KB 系统配额访问 JobQuotaProjectDao 5KB 项目配额访问 六、核心流程 6.1 第三方构建机调度流程 Process 模块发送调度消息 │ ▼ ThirdPartyBuildListener.onBuildStart() │ ▼ ThirdPartyDispatchService.dispatch() │ ├─► 检查配额 │ └─► JobQuotaManagerService.checkJobQuota() │ ├─► 选择构建机 │ ├─► 根据环境 ID 筛选 │ ├─► 根据 Agent 状态筛选 │ └─► 负载均衡选择 │ ├─► 创建调度记录 │ └─► ThirdPartyAgentBuildDao.create() │ └─► 通知 Agent └─► Redis 发布任务消息
6.2 Agent 领取任务流程 Agent 轮询请求任务 │ ▼ BuildAgentBuildResource.claimTask() │ ▼ ThirdPartyAgentService.claimTask() │ ├─► 验证 Agent 身份 │ └─► 检查 Agent ID 和 Secret Key │ ├─► 查询待执行任务 │ └─► ThirdPartyAgentBuildDao.getQueueTask() │ ├─► 更新任务状态 │ └─► status = RUNNING │ └─► 返回任务信息 └─► ThirdPartyBuildInfo
6.3 构建完成流程 Agent 报告构建完成 │ ▼ BuildAgentBuildResource.finishTask() │ ▼ ThirdPartyAgentService.finishTask() │ ├─► 更新任务状态 │ └─► status = DONE / FAILURE │ ├─► 释放配额 │ └─► JobQuotaManagerService.releaseQuota() │ └─► 通知 Process 模块 └─► 发送构建完成事件
七、配额管理 7.1 配额维度 维度 说明 系统级 全局最大并发数、单任务最大时长 项目级 项目最大并发数、项目最大运行时长 构建机类型 按 Docker/第三方/K8s 分别限制 7.2 配额检查 // 检查配额是否足够 fun checkJobQuota( projectId: String, vmType: JobQuotaVmType, buildId: String ): Boolean { // 1. 检查系统级配额 val systemQuota = jobQuotaSystemDao.get(vmType) val systemRunning = runningJobsDao.countByVmType(vmType) if (systemRunning >= systemQuota.runningJobsMax) { return false }
// 2. 检查项目级配额
val projectQuota = jobQuotaProjectDao.get(projectId, vmType)
val projectRunning = runningJobsDao.countByProject(projectId, vmType)
if (projectRunning >= projectQuota.runningJobsMax) {
return false
}
return true
}
八、与其他模块的关系 8.1 依赖关系 ┌─────────────────────────────────────────────────────────────────┐ │ Dispatch 模块依赖关系 │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ┌───────────┐ │ │ │ process │ ──────► 发送调度消息 │ │ └───────────┘ │ │ │ │ │ ▼ │ │ ┌───────────┐ │ │ │ dispatch │ │ │ └─────┬─────┘ │ │ │ │ │ ├──────► project (项目信息) │ │ ├──────► environment (构建机信息) │ │ └──────► auth (权限校验) │ │ │ │ 被依赖: │ │ - agent(构建机领取任务) │ └─────────────────────────────────────────────────────────────────┘
8.2 服务间调用示例 // Process 模块查询调度状态 client.get(ServiceDispatchJobResource::class).getDispatchJob( projectId = projectId, // english_name pipelineId = pipelineId, buildId = buildId, vmSeqId = vmSeqId )
// Environment 模块获取 Agent 信息 client.get(ServiceThirdPartyAgentResource::class).getAgentById( projectId = projectId, agentId = agentId )
九、开发规范 9.1 新增调度类型 在 JobQuotaVmType 添加新类型 创建对应的调度服务实现 在配额表中添加新类型的配置 实现任务分发和状态管理逻辑 9.2 调度记录查询示例 // 查询构建任务 val task = thirdPartyAgentBuildDao.get( dslContext = dslContext, buildId = buildId, vmSeqId = vmSeqId )
// 查询 Agent 的运行任务 val runningTasks = thirdPartyAgentBuildDao.listByAgentId( dslContext = dslContext, agentId = agentId, status = PipelineTaskStatus.RUNNING.status )
十、常见问题
Q: 如何选择构建机? A: 根据环境 ID、Agent 状态、负载情况综合选择,优先选择空闲的 Agent。
Q: 配额不足时任务会怎样? A: 任务会进入队列等待,直到有配额释放。
Q: Agent 离线后任务会怎样? A: 任务会被标记为失败,或者重新调度到其他 Agent。
Q: 如何调整项目配额? A: 通过运维接口 OpJobQuotaProjectResource 调整。
版本: 1.0.0 | 更新日期: 2025-12-11