编程 最好的工作流引擎是编程语言:Vercel Workflow SDK 的设计思路

2026-09-07 08:52:37

最好的工作流引擎是编程语言:Vercel Workflow SDK 的设计思路

Vercel 官方博客文章阐述一个观点:工作流(workflow)本质是 DAG,而编程语言本身就是表达 DAG 的工具——所以最好的工作流引擎应该让你写普通代码,而不是画流程图或写配置。作者结合用 Temporal 的亲身经验,介绍 Vercel Workflow SDK 如何把"工作流即代码"做简单。本文基于该文章,梳理核心设计与取舍。

代码本身就是 DAG

Airflow 这类经典工作流框架要求你手绘 DAG:把任务和依赖显式画成图,真正的业务逻辑埋在节点里。作者认为这方向反了——表达"先做这个、再做那个、这些并行、这里分支"的工具早就有了,就是编程语言本身:AST 是 DAG,软件本身就是 DAG。

用 Temporal 学到的东西

  • 基础设施太重:从零起步时,要搭 Temporal Cloud(或自托管 Frontend/History/Matching/Worker 服务加数据库)、自己跑 worker 集群(实践中就是 Kubernetes)、接线任务队列与活动注册、管理 worker 扩缩容和发布管线、配置 mTLS 和数据加密。基础设施到位后工作流体验很好,但起步门槛高。
  • 在飞工作流的版本化很难:运行中改代码,旧版本 worker 已下线,重放(replay)会拿新代码跑旧事件历史,非确定性错误。官方方案是 patching API(patched()/GetVersion),要按变更 ID 分支并走多阶段弃用流程,改多了代码变成版本标志的灌木丛。
  • signal/query/update 三个原语难解释:三者各有规则(query 不能阻塞、signal 即发即忘会被缓冲),演示时最难讲清楚。"如果不用白板讲不明白人机交互原语,那就是太复杂了"——Workflow SDK 用单一原语 hook 替代三者。

Workflow SDK 长什么样

一个普通代码文件,"use workflow" 标记编排器,"use step" 标记有副作用的单元,中间就是 await、try/catch、Promise.all、循环和条件:

export async function processOrderWorkflow(orderId: string) {
  "use workflow";
  const order = await fetchOrder(orderId);
  await chargePayment(order);
  return { orderId, status: "completed" };
}

async function chargePayment(order: Order) {
  "use step"; // 这里有完整 Node.js 能力
  const charge = await stripe.charges.create({ /* ... */ });
  return { chargeId: charge.id };
}

自然得到的能力:

  • 没有 DAG 文件:编译器读指令把代码拆成 workflow 与 client/step 包,图就是你的控制流
  • 重试:未捕获错误默认重试;抛 FatalError 停止;RetryableError 自定义退避;fn.maxRetries 微调
  • 临时 webhook:createWebhook() 一行创建运行内真实可调用的 URL,运行会暂停直到有人 POST——无需路由或 handler
  • hook 原语:createHook() 后 await,收到的数据就是返回值;一个概念替代 signals/queries/updates

库,不是平台

传统引擎让你为框架自带基础设施;Workflow SDK 把框架带到你已有的基础设施上。灵感来自 DBOS(开源持久化执行库,几乎全客户端运行,服务端只要 Postgres)。Workflow SDK 没有需要自托管或付费的专属编排器,唯一需要的是你已经在跑的东西:应用、数据库、队列。

后端可替换:整个设计是规范——任何基础设施都能实现 workflow/step/hook。流用 Redis/Kafka 等,持久化用 Postgres/Cassandra/文件系统/Turso/Durable Objects 等,队列用 Vercel Queues/SQS/Cloudflare Queues 等。运行时只面对单一接口 World(存储、队列、认证、流),换任何一层都不动工作流代码。团队维护了受 DBOS 启发的第一方 Postgres world(Postgres 承担持久化、队列、流),所有 world 都没有 worker 集群和控制面。

总结

这篇文章的价值在理念:工作流引擎的演进方向是"消灭框架感"——把编排表达交给宿主语言(普通控制流天然是可重放的工作流图),把基础设施成本压到最小(库而非平台),把复杂原语收敛(hook 替代 signal/query/update)。对在选型工作流引擎或自建编排的团队,这个对比(Airflow 显式 DAG vs Temporal 强基础设施 vs DBOS/Workflow SDK 库式方案)很值得参考。

来源:https://vercel.com/blog/the-best-workflow-engine-is-a-programming-language

推荐文章

程序员茄子在线接单