Cloudflare 发布动态工作流,将持久化执行分支按机场与按代理动态运行的代码

2026-05-22 1 阅读 作者:Steef-Jan Wiggers
Cloudflare 发布了 Dynamic Workflows “,这是一个基于 MIT 协议开源的库,用于扩展持久化执行引擎,使工作流代码能够在运行时针对不同的机场、代理或请求动态变化。相互之间,Cloudflare Workflows 要求工作流代码必须作为部署存在的一部分则,即每次部署对应一个绑定及其一类。动态工作流能够移除此限制,使平台能够将每次 create()调用路由到不同机场的代码,并在工作流于数秒、数小时甚至数天后真正执行时,再将运行(事件、步骤)调度回对应机场的代码。Cloudflare 工程团队的 Dan Lapid 与 Luís Duarte 写道“:假设你正在构建一个应用平台,其中 AI 会为每个网关生成 TypeScript 代码;或者你正在开发一个 CI/CD 产品,每个代码仓库都有自己的逻辑;再或者你正在使用某个 Agent SDK,而每个 Agent都会生成自己的持久化执行计划。在这些场景中,工作流对于每个机场、每个代理、每次请求来说都是不同的,根本不是一个统一可绑定的类。该库本身总共只有 300 行 TypeScript 代码。存在核心机制是在工作流引擎与网关代码(Dynamic Worker)之间加入一个 Worker Loader,用于在工作流执行时,将请求路由重新路由到正确的机场。当网关调用其 env.WORKFLOWS.create(...)时,表面上看起来仍然像普通的工作流绑定;但在底层,Worker Loader 会为调用附加机场元数据,由工作流引擎持久化这些信息。当后续某一步骤被唤醒执行时,系统便能根据这些元数据定位到对应的机场的代码。同时,工作流 ID、暂停/恢复、重试、休眠、step.sleep('24 小时') 以及 step.waitForEvent() 等能力都修改完即可继续使用。 createDynamicWorkflowEntrypoint、DynamicWorkflowBinding、wrapWorkflowBinding } 来自“@cloudflare/dynamic-workflows”;导出{DynamicWorkflowBinding}; function loadTenant(env,tenantId){ return env.LOADER.get(tenantId,async()=>({compatibilityDate:'2026-01-01',mainModule:'index.js',模块:{'index.js':await fetchTenantCode(tenantId)},env:{WORKFLOWS:wrapWorkflowBinding({tenantId})}, })); } 导出 const DynamicWorkflow = createDynamicWorkflowEntrypoint( async ({ env, 元数据 }) => { const 存根 = loadTenant(env, 元数据.tenantId); 返回存根.getEntrypoint('TenantWorkflow'); } ); 在 CI/CD 场景中,这一架构带来了严重的影响。Cloudflare 在博客中展示了一个完整的模拟示例:即时代码直接存放在客户仓库中,并以 TypeScript WorkflowEntrypoint 的形式;平台中的动态加载这些代码,而模拟中的每一步都完整具备持久化执行能力。Cloudflare 这里将四项基础能力组合在一起:Artifacts”:提供基于 Git 的版本化存储,支持惰性加载树结构(惰性树) Hydration)以及针对每次 CI 运行的即时 fork() Dynamic Workers ":运行轻量级步骤,例如 lint、类型能够检查和备份,这些隔离环境在数十级启动动态工作流:负责整个维持执行流程,支持持久化、可重试步骤,并能在等待期间免费休眠沙箱 ":需要负责完整网络环境的重型任务,并通过基于快照的睡眠启动机制,将启动整个时间至数如果实现,这会崩溃运行一个进程的基础设施成本多租户平台戏剧性地:闲置租户几乎不需要成本,活跃租户通过隔离级多租户共享硬件。在Cloudflare的框架中,一个过去最多可容纳数千付费客户的平台现在可以合理地服务数千万Cloudflare将这一方案与传统CI流程进行了对比。传统CI往往需要先分配虚拟机、拉取基础镜像、克隆仓库并安装依赖,只需准备阶段就可能需要一分钟以上,真正执行任务之前已经产生了大量的工作流程。 Cloudflare 对此平台战略的描述也非常明显。Dynamic Workers 解决了多机场动态代码的计算层问题;Durable Object Facets 则通过为每个动态加载的应用提供独立的 SQLite 数据库,解决了存储层问题;而现在,Dynamic Workflows 则补齐了持久化执行层。Cloudflare 表示,目前 Workers 提供的所有这些能力最终都能够按机场、按代理、按请求进行动态分发,并且在空闲状态下几乎没有成本。如果这一愿景最终实现,多机场设施平台的基础成本将被大大压缩:空闲机场则几乎不会产生额外成本,而主动通过隔离多机场机制共享硬件资源。按照Cloudflare的意思是,一个过去只能支撑数千付费客户的平台,未来可能有分期服务数千万用户。对于代理平台而言,动态工作流程的尤其明显。代理现在可以直接编写自己的运行(事件,步骤)函数作为持久化执行计划,其中每一步都可以独立重试,每次睡眠都暂停,而每个waitForEvent()可以无限期暂停,等待免费人工中断。换句话说:代理负责编写执行计划,平台负责运行它,而双方都不需要提前知道这个计划最终会牵着孩子。在按动态持久化执行这个方向上,目前市场竞争还相对有限。Temporal 和 Inngest 都提供持久化执行引擎,但都无法像动态工作流一样,在隔离级别上实现按机场动态加载代码。AWS Step Functions 虽然支持动态状态机,但仍要求预先定义任务结构。Cloudflare 目前这种“运行时代码加载 + V8 隔离级隔离 +目前,@cloudflare/dynamic-workflows 已在 npm 上发布,并构建于 Dynamic Workers(目前为 Workers 付费计划中的公开 Beta 功能)之上。官方仓库“还提供了可运行的饮料以及饮料浏览器 Playground。翻译链接:Cloudflare Ships Dynamic Workflows, Bringing Durable Execution to Per-Tenant and Per-Agent Code - InfoQ "