3. 任务调度平台整体架构:调度器、执行器、任务仓库、触发器、监控模块的职责与交互关系
在微服务架构下,任务调度平台不再是单体应用中的一个模块,而是由多个职责单一、独立部署的微服务组件构成的分布式系统。理解调度器、执行器、任务仓库、触发器、监控模块这五大核心组件的职责与交互关系,是设计稳定、可扩展的调度平台的基础。
3.1 五大核心组件职责概览
下表从职责边界、数据存储、典型实现三个维度,对五个核心组件进行对比:
| 组件 | 核心职责 | 数据存储 | 典型实现 |
|---|---|---|---|
| 调度器 (Scheduler) | 解析触发规则,生成调度计划,分发任务实例 | 调度队列、任务实例表 | Quartz Scheduler、xxl-job 调度中心 |
| 执行器 (Executor) | 接收任务实例,执行具体业务逻辑,上报执行状态 | 执行日志、本地缓存 | Java 线程池、Go Worker Pool |
| 任务仓库 (Task Repository) | 持久化任务定义、版本管理、元数据存储 | 关系型数据库 (MySQL/PostgreSQL) | JPA Repository、MyBatis Mapper |
| 触发器 (Trigger) | 定义任务触发条件(时间、事件、依赖) | 触发器配置表 | Cron 表达式、事件监听器、DAG 依赖检查 |
| 监控模块 (Monitor) | 采集执行指标,检测异常,发送告警 | 时序数据库 (Prometheus/InfluxDB) | Metrics 采集、告警规则引擎 |
3.2 组件交互关系与核心流程
下图展示了任务从创建到执行完成的完整交互链路:
3.3 组件职责详解
3.3.1 调度器 (Scheduler)
调度器是整个平台的决策中心。它从任务仓库加载任务定义,结合触发器的规则生成调度计划,并将任务实例分发给合适的执行器。调度器必须支持高可用部署,避免单点故障。
- 核心能力:任务分片、负载均衡、失败重试、阻塞处理策略。
- 关键设计:调度队列使用 Redis 或数据库锁保证任务不被重复调度。
3.3.2 执行器 (Executor)
执行器是实际执行任务逻辑的工作节点。每个执行器实例注册到调度器,接收任务实例后通过线程池或协程池并发执行。执行器需要上报心跳和执行结果,支持优雅关闭。
- 核心能力:任务执行、日志记录、结果回调、资源隔离。
- 关键设计:执行器与调度器之间通过 HTTP/RPC 通信,执行器无状态,便于水平扩展。
3.3.3 任务仓库 (Task Repository)
任务仓库负责所有任务元数据的持久化存储,包括任务定义、参数、超时设置、重试次数等。它提供版本管理能力,支持任务定义的灰度发布和回滚。
- 核心能力:CRUD 操作、版本快照、标签分类、权限控制。
- 关键设计:任务定义与任务实例分离,实例数据按时间分表存储。
3.3.4 触发器 (Trigger)
触发器定义了任务何时被调度。支持多种触发类型:
| 触发类型 | 描述 | 示例 |
|---|---|---|
| Cron 触发 | 基于时间表达式周期性触发 | 0 0/5 * * * ?(每5分钟) |
| 事件触发 | 监听消息队列或数据库变更事件 | 订单创建后触发结算任务 |
| 依赖触发 | 上游任务完成后触发下游任务 | ETL 任务链中的 DAG 依赖 |
| 手动触发 | 运维人员通过 API 或控制台手动执行 | 临时数据修复任务 |
3.3.5 监控模块 (Monitor)
监控模块负责全链路可观测性。它采集调度延迟、执行耗时、失败率、队列积压等指标,并在异常时触发告警。监控模块不参与调度主流程,避免对核心链路造成影响。
- 核心能力:指标采集、日志聚合、告警通知、Dashboard 展示。
- 关键设计:使用 Prometheus + Grafana 作为指标存储和可视化方案,告警规则支持静默和升级。
设计建议: 在 OpenAPI 契约设计中,监控模块的接口应定义为“旁路上报”模式,即执行器通过异步方式上报状态,调度器不依赖监控模块的响应来继续调度,避免监控系统故障导致调度中断。
3.4 交互关系总结
五个组件的交互遵循以下原则:
- 调度器为中心:所有调度决策由调度器统一做出,执行器不主动拉取任务。
- 异步解耦:执行器上报状态、监控模块采集指标均采用异步方式,不阻塞主流程。
- 数据流向清晰:任务定义从仓库流向调度器,任务实例从调度器流向执行器,执行状态从执行器流向监控模块。
- 故障隔离:任一组件宕机不影响其他组件的独立运行,调度器通过心跳检测执行器健康状态。
架构要点: 在微服务任务调度平台中,调度器与执行器之间的通信协议(如 gRPC 或 RESTful API)是 OpenAPI 契约设计的核心边界。建议将调度器对外暴露的接口定义为“任务分发接口”和“执行器注册接口”,将执行器对外暴露的接口定义为“心跳上报接口”和“结果回调接口”,形成清晰的 API 网关分层。