3. 任务调度核心概念:任务、工作流、触发器、调度策略、任务队列
在构建任务调度平台时,理解其核心概念是设计健壮系统的前提。本章将深入剖析任务调度领域的五个基础构件:任务、工作流、触发器、调度策略与任务队列。这些概念不仅是 OpenAPI 接口设计的基石,也是 Temporal 工作流引擎的核心抽象。
3.1 核心概念总览
下表从定义、职责与典型场景三个维度,快速建立五个概念的认知框架:
| 概念 | 定义 | 核心职责 | 典型场景 |
|---|---|---|---|
| 任务 (Task) | 调度系统的最小执行单元,代表一次具体的操作指令 | 封装执行逻辑、输入参数与重试配置 | 发送邮件、数据清洗、调用 API |
| 工作流 (Workflow) | 一组有依赖关系的任务编排,定义执行顺序与分支逻辑 | 管理任务状态、处理超时与补偿 | 订单处理、ETL 流水线、审批流程 |
| 触发器 (Trigger) | 启动任务或工作流的条件或事件源 | 监听事件、解析时间表达式、生成触发信号 | Cron 表达式、消息队列事件、HTTP 回调 |
| 调度策略 (Schedule Policy) | 控制任务执行行为的规则集合 | 决定重试次数、并发限制、速率控制 | 指数退避重试、最大并发数、限流 |
| 任务队列 (Task Queue) | 任务与 Worker 之间的缓冲通道,实现异步解耦 | 负载均衡、优先级排序、持久化存储 | Redis 队列、Temporal 任务队列、Kafka |
3.2 任务 (Task) —— 最小执行单元
任务是调度平台中最基本的执行原子。在 OpenAPI 设计中,任务通常对应一个可调用的端点或函数;在 Temporal 中,任务对应一个 Activity。
关键属性: 任务类型、输入参数、超时时间、重试策略、幂等键。
一个典型的任务定义(JSON 格式)如下:
{
"taskId": "send-welcome-email-001",
"taskType": "EMAIL_SEND",
"input": {
"to": "user@example.com",
"template": "welcome_v2"
},
"timeout": "30s",
"retryPolicy": {
"maxAttempts": 3,
"backoffCoefficient": 2.0
},
"idempotencyKey": "order-12345-email"
}
3.3 工作流 (Workflow) —— 任务编排的骨架
工作流将多个任务组合成一个有状态、可恢复的执行流程。Temporal 的工作流模型具有 持久化执行 特性:即使 Worker 崩溃,工作流也能从最后一个稳定点恢复。
工作流的核心能力包括:
- 顺序执行: Task A → Task B → Task C
- 并行执行: 同时启动多个任务,等待全部完成
- 条件分支: 根据前序任务结果选择不同路径
- 超时与补偿: 定义 Saga 模式下的回滚操作
实践建议: 在 Temporal 中,工作流代码应只包含编排逻辑(如循环、条件、调用 Activity),避免执行耗时操作或直接调用外部服务。所有副作用应封装在 Activity 中。
3.4 触发器 (Trigger) —— 启动一切的信号
触发器决定了任务或工作流何时开始执行。根据触发来源,可分为三类:
| 触发器类型 | 触发方式 | 适用场景 |
|---|---|---|
| 时间触发器 | Cron 表达式、固定间隔、一次性定时 | 每日报表、定期数据备份 |
| 事件触发器 | 消息队列、Webhook、数据库变更 | 用户注册后发送欢迎邮件 |
| 依赖触发器 | 上游任务完成、工作流状态变更 | ETL 中数据加载完成后触发转换 |
在 OpenAPI 中,触发器通常通过 /triggers 端点管理,支持创建、启用、禁用与删除操作。
3.5 调度策略 (Schedule Policy) —— 执行行为的控制器
调度策略定义了任务在运行时的行为约束。没有合理的策略,系统容易陷入资源耗尽或雪崩状态。
常见的调度策略维度:
- 重试策略: 最大重试次数、退避算法(固定间隔、指数退避、抖动)
- 并发控制: 最大并行任务数、队列等待上限
- 速率限制: 每秒/每分钟最大执行次数
- 超时策略: 任务执行超时、工作流运行超时
- 优先级策略: 高优先级任务插队执行
常见陷阱: 重试策略中如果退避系数设置过大(如 10.0),可能导致后续任务等待时间过长,引发连锁延迟。建议初始退避设为 1s,系数 2.0,最大间隔不超过 60s。
3.6 任务队列 (Task Queue) —— 异步解耦的枢纽
任务队列是调度系统的核心中间层,它解耦了任务的生产者(调度器)与消费者(Worker)。在 Temporal 中,任务队列是 Worker 订阅并执行 Activity 或 Workflow 的通道。
任务队列的核心特性:
- 负载均衡: 多个 Worker 监听同一队列,自动分配任务
- 持久化: 任务在队列中持久存储,防止丢失
- 优先级: 支持高/低优先级队列,确保关键任务优先执行
- 速率匹配: 生产者与消费者速率不一致时,队列起到缓冲作用
3.7 概念关系图
下图展示了五个核心概念之间的协作关系:
3.8 在 Temporal 中的映射
将上述概念映射到 Temporal 的具体实现中,有助于加深理解:
| 通用概念 | Temporal 对应实现 | 说明 |
|---|---|---|
| 任务 | Activity | 执行具体业务逻辑,如调用外部服务、读写数据库 |
| 工作流 | Workflow | 使用 Workflow 代码编排 Activity 调用顺序 |
| 触发器 | StartWorkflow / Schedule | 通过 SDK 启动工作流,或使用 CronSchedule 定时触发 |
| 调度策略 | RetryPolicy / TaskQueue 配置 | 在 ActivityOptions 中设置重试与超时 |
| 任务队列 | Task Queue (字符串名称) | Worker 通过 task_queue 参数订阅并拉取任务 |
3.9 设计原则与最佳实践
- 任务幂等性: 每个任务应设计为可重复执行而不产生副作用,使用幂等键去重。
- 工作流轻量化: 工作流代码只做编排,不做耗时计算;所有 I/O 操作放入 Activity。
- 队列隔离: 不同优先级或不同类型的任务使用独立队列,避免互相阻塞。
- 策略可配置: 调度策略应通过 OpenAPI 暴露为可配置参数,而非硬编码在代码中。
- 监控与告警: 对任务队列长度、任务失败率、工作流执行时间设置监控指标。
核心总结: 任务调度平台的本质是 触发器 驱动 工作流 编排 任务,通过 调度策略 控制行为,借助 任务队列 实现异步解耦。这五个概念构成了调度系统的完整闭环。