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 概念关系图

下图展示了五个核心概念之间的协作关系:

任务调度核心概念关系图 任务调度核心概念关系图 触发器 (Trigger) 工作流 (Workflow) 任务 (Task) 任务队列 (Task Queue) Worker 执行 调度策略 重试 · 并发 限流 · 超时 优先级

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 暴露为可配置参数,而非硬编码在代码中。
  • 监控与告警: 对任务队列长度、任务失败率、工作流执行时间设置监控指标。
核心总结: 任务调度平台的本质是 触发器 驱动 工作流 编排 任务,通过 调度策略 控制行为,借助 任务队列 实现异步解耦。这五个概念构成了调度系统的完整闭环。