4. 任务模型设计:任务类型、属性与状态机

任务模型是异步任务编排引擎的“数据骨架”。在 IAM 平台中,每一次权限变更、角色同步、策略下发最终都会抽象为一个或多个任务实例。本章从任务类型、任务属性、任务状态机三个维度,定义引擎的核心数据模型。

4.1 任务类型:同步 / 异步 / 补偿

根据执行方式与业务语义,任务分为三种基础类型:

类型 执行方式 典型场景 是否参与编排
同步任务 调用方线程阻塞等待结果 本地缓存刷新、轻量校验 否(直接返回)
异步任务 提交到线程池或消息队列,回调通知 跨系统策略下发、批量用户同步 是(DAG 节点)
补偿任务 由编排引擎在失败后自动触发 回滚已执行的子任务、发送告警 是(失败分支)
设计要点:同步任务不进入编排引擎的 DAG 调度队列,仅用于快速前置检查;异步任务和补偿任务才是编排引擎的核心处理对象。补偿任务必须幂等,且支持多次重试。

4.2 任务属性:ID、类型、超时、重试策略

每个任务实例携带一组结构化属性,用于调度决策和异常处理:

  • 任务 ID(taskId):全局唯一,推荐使用雪花算法或 UUID,用于追踪全链路日志。
  • 任务类型(type):SYNC / ASYNC / COMPENSATION,决定调度行为。
  • 超时时间(timeoutMs):任务执行的最大等待时间,超时后触发 Timeout 状态。
  • 重试策略(retryPolicy):包含最大重试次数、重试间隔(固定/指数退避)、重试条件。
  • 依赖列表(dependencies):前置任务 ID 集合,用于 DAG 拓扑排序。
  • 上下文(context):JSON 格式的输入参数,如目标用户 ID、策略内容。
// 任务属性结构示例(Java POJO)
public class TaskDefinition {
    private String taskId;                // 全局唯一 ID
    private TaskType type;                // SYNC | ASYNC | COMPENSATION
    private long timeoutMs;               // 超时时间,单位毫秒
    private RetryPolicy retryPolicy;      // 重试策略
    private List<String> dependencies;    // 前置依赖任务 ID
    private Map<String, Object> context;  // 执行上下文
}
实践建议:重试间隔推荐使用指数退避(Exponential Backoff),初始间隔 1s,最大间隔 60s,避免重试风暴压垮下游系统。

4.3 任务状态机:Pending → Running → Success / Failed / Timeout

任务状态机定义了任务从创建到终态的完整生命周期。IAM 平台采用五态模型,确保状态流转清晰可审计:

任务状态机流转图 Pending Running Success Failed Timeout 调度 执行完成 执行异常 超时 重试(回 Pending) 说明:Failed 状态可通过重试策略回到 Pending 重新调度;Timeout 为终态,不再重试,需人工介入或触发补偿任务。

状态流转规则如下:

  • Pending → Running:编排引擎根据 DAG 拓扑顺序,将就绪任务提交到执行器。
  • Running → Success:任务正常执行完毕,返回结果。
  • Running → Failed:任务抛出异常或返回错误码,进入失败状态。
  • Running → Timeout:任务执行时间超过 timeoutMs,引擎强制中断并标记超时。
  • Failed → Pending:若重试策略允许且未达到最大重试次数,引擎将任务重新入队调度。
避坑指南:Timeout 状态不应自动重试,因为超时通常意味着下游系统负载过高或网络分区,重试会加剧问题。建议 Timeout 任务直接触发补偿流程或人工告警。

4.4 任务模型与编排引擎的关系

任务模型是编排引擎的“数据单元”,引擎通过任务属性中的 dependencies 构建 DAG,通过 type 决定调度策略,通过 retryPolicy 控制容错行为。一个典型的编排流程如下:

  1. 用户提交一个包含多个任务的 DAG 定义。
  2. 引擎解析每个任务的 dependencies,生成拓扑排序。
  3. 引擎从 Pending 状态的任务开始调度,依次推进。
  4. 遇到 Failed 任务时,根据 retryPolicy 决定是否重试或触发补偿。
  5. 所有任务到达 Success 或 Timeout 终态后,引擎输出整体执行结果。