SuperAPI AI 工具集

workflow-orchestration-patterns

编程与开发

查看项目

更新于 10-16 07:43

技能介绍

工作流编排模式(Workflow Orchestration Patterns)是一份围绕 Temporal 的工作流编排架构指南,覆盖基础设计决策、弹性模式以及构建可靠分布式系统的实践要点(来源标注为 docs.temporal.io 等官方资料)。

适用场景 适合多步骤、跨机器/服务/数据库的流程;需要全有或全无语义的分布式事务;需自动持久化状态的长时间运行工作流(数小时至数年);必须从最后一个成功步骤恢复的故障恢复;以及预订、订单、营销活动、审批等业务流程,库存跟踪、账户管理、购物车等实体生命周期管理,CI/CD、资源开通、部署等基础设施自动化,和需要超时与升级机制的人在环路系统。不适合的场景包括:简单 CRUD(用直接 API 调用)、纯数据处理管道(用 Airflow、批处理)、无状态请求/响应(用标准 API)、实时流处理(用 Kafka、事件处理器)。

核心设计决策:工作流与活动的分离 基本规则:工作流承载编排逻辑与决策,活动承载外部交互(API、数据库、网络调用)。工作流包含业务逻辑与协调,必须确定性(相同输入产生相同输出),不能直接发起外部调用,状态在故障间自动保留,可在基础设施故障下运行数年;其任务如决定执行哪些步骤、处理补偿逻辑、管理超时与重试、协调子工作流。活动处理所有外部系统交互,可以是非确定性的(API 调用、数据库写入),内置超时与重试逻辑,必须幂等(调用 N 次等于调用一次),通常短时(秒到分钟);其任务如调用支付网关 API、写入数据库、发送邮件或通知、查询外部服务。判断框架:是否触及外部系统?是则活动;是否为编排/决策逻辑?是则工作流。

核心工作流模式

  1. Saga 补偿模式:实现具备回滚能力的分布式事务。步骤为:执行前先注册补偿、通过活动执行该步骤、失败时按逆序(LIFO)运行所有补偿。示例:预留库存(补偿:释放库存)→ 扣款(补偿:退款)→ 履约(补偿:取消履约)。关键要求:补偿必须幂等、执行前注册补偿、逆序运行补偿、优雅处理部分失败。
  2. 实体工作流(Actor 模型):一个工作流执行对应一个实体(购物车、账户、库存项),工作流在实体生命周期内持续存在,通过信号接收状态变更,支持查询当前状态。用例包括购物车、银行账户、商品库存;优势是封装实体行为、保证单实体一致性、天然事件溯源。
  3. 扇出/扇入(并行执行):派生多个子工作流或并行活动,等待全部完成,聚合结果,处理部分失败。扩展规则:不要扩展单个工作流;100 万个任务可派生 1000 个子工作流 × 每个 1000 个任务,保持每个工作流有界。
  4. 异步回调模式:工作流发送请求后等待信号,外部系统异步处理并发送信号恢复工作流,工作流继续处理响应。用于人工审批、Webhook 回调、长时间运行的外部流程。

状态管理与确定性 Temporal 自动保留完整的程序状态,事件历史记录每条命令与事件,可从崩溃中无缝恢复并还原故障前状态。工作流作为状态机执行,重放行为必须一致,相同输入每次产生相同输出。禁止在工作流中使用:线程、锁、同步原语;随机数生成(random());全局状态或静态变量;系统时间(datetime.now());直接文件 I/O 或网络调用;非确定性库。允许:workflow.now()(确定性时间)、workflow.random()(确定性随机)、纯函数与计算、调用活动(非确定性操作)。版本策略:使用 workflow.get_version() 安全变更;创建新工作流类型并将新执行路由过去;保证旧事件可正确重放。

弹性与错误处理 重试策略:默认情况下 Temporal 会永久重试活动;可配置初始重试间隔、退避系数(指数退避)、最大间隔(重试延迟上限)、最大尝试次数(最终失败)。不可重试错误包括输入无效(校验失败)、业务规则违规、永久性失败(资源不存在)。

幂等性 活动可能执行多次,网络故障会触发重试,重复执行必须安全。实现策略:幂等键(去重)、带唯一约束的先检查后执行、用 upsert 取代 insert、记录已处理请求 ID。

活动心跳 用于检测停滞的长时间活动:活动周期性发送心跳并携带进度信息,未收到心跳则超时,从而支持基于进度的重试。

最佳实践 工作流设计:保持职责单一;使用小工作流与子工作流以利扩展;边界清晰(工作流编排、活动执行);使用跳时测试环境在本地测试。活动设计:幂等操作、短时(秒到分钟而非小时)、始终配置超时、长任务使用心跳上报进度、区分可重试与不可重试错误。

常见陷阱:工作流中使用 datetime.now() 而非 workflow.now()、线程或异步操作、直接调用外部 API、非确定性逻辑;活动侧的非幂等操作、缺少超时、无错误分类(重试校验错误)、忽略负载限制(每个参数 2MB)。

运维考量:监控工作流执行时长、活动失败率、重试次数与退避、待处理工作流数量;可扩展性方面采用 worker 水平扩展、任务队列分区、子工作流分解、适当的活动批处理。

其他资源:Temporal 核心概念(docs.temporal.io/workflows)、工作流模式(docs.temporal.io/evaluate/use-cases-design-patterns)、最佳实践(docs.temporal.io/develop/best-practices)、Saga 模式(temporal.io/blog/saga-pattern-made-easy)。关键原则:工作流=编排,活动=外部调用;确定性不可妥协;幂等性对活动至关重要;状态自动保留;为失败与恢复而设计。