最好的工作流引擎就是编程语言

最好的工作流引擎就是编程语言

💡 原文英文,约1900词,阅读约需7分钟。
📝

内容提要

Workflow SDK是Vercel推出的新框架,将TypeScript代码转化为持久化执行,无需新基础设施。它用“use workflow”和“use step”指令标记代码,编译器自动生成DAG,支持重试、Webhooks和hooks,替代传统信号/查询/更新。后端可替换,支持Postgres、Redis等,无需自建worker集群。版本管理通过固定部署实现,目标是让步骤调用像普通函数一样快速免费。

🔎

延伸解读

从手绘DAG到代码即DAG

传统工作流引擎如Airflow要求开发者显式绘制任务依赖图,而Workflow SDK利用编程语言本身的控制流(如await、Promise.all)自动生成DAG。这种设计让工作流代码更接近普通函数调用,降低了编写和理解的复杂度。文章强调,代码本身就是DAG,无需额外建模,这是对传统工作流开发范式的重要简化。

版本管理的取舍:固定部署 vs 补丁API

传统引擎(如Temporal)通过补丁API处理运行中工作流的代码变更,但会导致代码被版本标记污染。Workflow SDK选择将每次运行固定到启动时的部署版本,避免非确定性错误。这种方案依赖Vercel的不可变部署特性,但社区世界(如Platformatic)已实现类似机制。文章指出,这体现了将复杂性从开发者转移到基础设施的设计哲学。

用Hook统一信号、查询和更新

Temporal提供信号、查询和更新三种独立原语,学习曲线陡峭。Workflow SDK用单一的Hook概念替代,通过createHook()和await实现暂停与恢复,并支持Webhook作为便捷封装。这种简化降低了人机交互工作流的理解成本,使开发者无需区分不同原语的适用场景。

性能目标:让步骤调用像函数调用一样廉价

当前每个步骤涉及网络和队列往返,开销较大,可能促使开发者过度优化步骤粒度。Workflow SDK的目标是让步骤调用几乎零成本,使开发者能随意添加“use step”而不必担心性能。v5已实现5倍性能提升,v6将进一步优化,并计划让第三方世界同样高效。这反映了分布式计算向本地函数调用体验靠拢的趋势。

Q&A

Workflow SDK是什么?它如何将TypeScript代码转化为持久化执行?

Workflow SDK是Vercel推出的新框架,它通过编译器将TypeScript代码转化为持久化执行,无需新基础设施。开发者只需在代码中使用'use workflow'和'use step'指令标记编排器和步骤,编译器会自动生成DAG,并处理重试、Webhooks和hooks等。

Workflow SDK与传统工作流引擎(如Temporal)相比有哪些优势?

Workflow SDK无需自建worker集群或控制平面,它作为库运行在现有基础设施上(如Postgres、Redis等),后端可替换。它用单一的hook概念替代了Temporal中的signals、queries和updates,简化了开发体验。版本管理通过固定部署实现,避免了传统引擎中复杂的patching API。

Workflow SDK如何处理版本管理?

Workflow SDK通过将每个运行固定到启动它的特定部署来处理版本管理。运行会继续使用启动时的代码版本,因此更改工作流代码不会影响正在进行的运行。这避免了传统引擎中需要手动使用patching API进行多阶段弃用和移除的复杂过程。

Workflow SDK中的hooks是什么?它如何替代signals、queries和updates?

Workflow SDK中的hooks是一种通用原语,用于在运行中的工作流中接收数据。通过createHook<T>()创建hook,然后await它,当有人发送数据时,该数据就会返回。这个单一概念替代了Temporal中的signals、queries和updates,简化了与运行中工作流的交互。

Workflow SDK的后端是可替换的吗?如何实现?

是的,Workflow SDK的后端是可替换的。整个框架是一个规范,任何基础设施都可以支持。运行时只与一个名为World的接口交互,该接口涵盖存储、队列、认证和流。开发者可以根据自己的技术栈选择不同的实现,例如使用Postgres、Redis、Kafka等,而无需更改工作流代码。

Workflow SDK中的步骤(step)性能如何?如何实现'步骤应该免费'的目标?

Workflow SDK正在努力使步骤调用像普通函数一样快速免费。目前每个步骤涉及网络和队列操作,有一定开销。但Workflow v5已经实现了高达5倍的性能提升,v6将进一步优化。目标是让开发者可以随意将任何函数标记为'use step',而无需担心性能损失。

🏷️

标签

➡️

继续阅读