SuperAPI AI 工具集

cloudflare-workflows

部署与运维

查看项目

更新于 10-16 06:19

技能介绍

用途:Cloudflare Workflows 为 Workers 提供持久化的多步骤执行能力,步骤会持久化状态、可在重启后继续、支持重试,并可休眠数天。

主要能力:通过 WorkflowEntrypoint 的 run(event, step) 编写逻辑;step.do(name, callback) 执行并持久化返回值,可传入重试与超时配置(默认 retries.limit 5、delay 10000、backoff exponential、timeout 10 分钟);支持 step.sleep 相对休眠与 step.sleepUntil 定时休眠(最长 365 天);step.waitForEvent 等待外部事件,默认超时 24 小时,事件可在流程到达等待点前缓冲投递。实例支持 create、createBatch、get、pause、resume、terminate、restart、status、sendEvent,并具有 queued、running、paused、waiting、complete、errored、terminated 等状态。使用 NonRetryableError 可阻止重试,可 try-catch 捕获后继续。

用法要点:在 wrangler.jsonc 配置 workflows 绑定(name、binding、class_name),用 npx wrangler deploy 部署。CLI 可管理实例,如 wrangler workflows instances list/describe/terminate 与 trigger。

限制与规则:步骤须粒度合理、命名确定、必须 await,返回值小于 1 MiB;不要修改 event.payload(不持久化),不要将状态存于步骤之外。免费与付费计划在 CPU 时间、并发实例、状态总量、保留期等方面存在差异,具体数值见官方资料。

[以下均为资料原文,保留原样]

WorkflowEntrypoint

export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
  async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
    // Workflow logic with steps
    return optionalResult;
  }
}

WorkflowEvent

interface WorkflowEvent<T> {
  payload: Readonly<T>; // Immutable input params
  timestamp: Date; // Creation time
  instanceId: string; // Unique instance ID
}

WorkflowStep

interface WorkflowStep {
  do<T>(name: string, callback: () => Promise<T>): Promise<T>;
  do<T>(name: string, config: StepConfig, callback: () => Promise<T>): Promise<T>;
  sleep(name: string, duration: Duration): Promise<void>;
  sleepUntil(name: string, timestamp: Date | number): Promise<void>;
  waitForEvent<T>(name: string, options: WaitOptions): Promise<T>;
}

快速开始

// src/index.ts
import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from "cloudflare:workers";
interface Env {
  MY_WORKFLOW: Workflow;
}

interface Params {
  userId: string;
  action: string;
}
export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
  async run(event: WorkflowEvent, step: WorkflowStep) {
    const user = await step.do("fetch user", async () => {
      const resp = await fetch(`https://api.example.com/users/${event.payload.userId}`);
      return resp.json();
    });

    await step.sleep("wait before processing", "1 hour");

    const result = await step.do("process action", async () => {
      return { processed: true, user: user.id };
    });

    return result; // Available in instance.status().output
  }
}
import { NonRetryableError } from "cloudflare:workflows";
const userData = await step.do("fetch user", async () => {
  return await fetchUser(userId);
});
let userData;
await step.do("fetch user", async () => {
  userData = await fetchUser(userId); // Will be lost!
});
const approval = await step.waitForEvent<{ approved: boolean }>("wait for approval", {
  type: "user_approval",
  timeout: "7 days",
});
await instance.sendEvent({
  type: "user_approval",
  payload: { approved },
});

wrangler.jsonc

{
  "name": "my-workflow-worker",
  "main": "src/index.ts",
  "workflows": [
    {
      "name": "my-workflow",
      "binding": "MY_WORKFLOW",
      "class_name": "MyWorkflow"
    }
  ]
}

部署

npx wrangler deploy

提高 CPU 限额

{
  "limits": {
    "cpu_ms": 300000 // 5 minutes
  }
}

Wrangler 命令

wrangler workflows instances list my-workflow
wrangler workflows instances describe my-workflow --id <instance-id>
wrangler workflows instances terminate my-workflow --id <instance-id>
wrangler workflows trigger my-workflow --params '{"key": "value"}'
wrangler workflows delete my-workflow

限制表(数据来自资料原文):

项目 Free Paid
每步 CPU 时间 10 ms 30 sec(上限 5 min)
每步墙钟时间 不限 不限
每步状态 1 MiB 1 MiB
事件负载 1 MiB 1 MiB
每实例总状态 100 MB 1 GB
最长休眠 365 天 365 天
每 Workflow 最大步数 1024 1024
并发实例 25 10,000
实例创建速率 100/sec 100/sec
排队实例 100,000 1,000,000
每实例子请求 50/req 1000/req
实例 ID 长度 100 chars 100 chars
已完成实例保留 3 days 30 days

定价(基于 Workers Standard):

指标 Free Paid
请求 100K/天(共享) 10M/月,+$0.30/M
CPU 时间 10 ms/次 30M ms/月,+$0.02/M ms
存储 1 GB 1 GB,+$0.20/GB-mo

注意:处于 waiting 状态(休眠、等待事件)的实例不计入并发限制。存储按所有实例计算,删除实例可释放存储,几分钟内更新。