cloudflare-workflows

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Cloudflare Workflows

Cloudflare Workflows

Status: Production Ready ✅ | Last Verified: 2025-12-27 | Version: 3.0.0
Dependencies: cloudflare-worker-base (for Worker setup)

状态:生产就绪 ✅ | 最后验证时间:2025-12-27 | 版本:3.0.0
依赖项:cloudflare-worker-base(用于Worker搭建)

Quick Start (10 Minutes)

快速入门(10分钟)

1. Create a Workflow

1. 创建工作流

Use the Cloudflare Workflows starter template:
bash
npm create cloudflare@latest my-workflow -- --template cloudflare/workflows-starter --git --deploy false
cd my-workflow
What you get:
  • WorkflowEntrypoint class template
  • Worker to trigger workflows
  • Complete wrangler.jsonc configuration
使用Cloudflare Workflows初始模板:
bash
npm create cloudflare@latest my-workflow -- --template cloudflare/workflows-starter --git --deploy false
cd my-workflow
你将获得
  • WorkflowEntrypoint类模板
  • 用于触发工作流的Worker
  • 完整的wrangler.jsonc配置

2. Basic Workflow Structure

2. 基础工作流结构

src/index.ts:
typescript
import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from 'cloudflare:workers';

type Env = {
  MY_WORKFLOW: Workflow;
};

type Params = {
  userId: string;
  email: string;
};

export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
  async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
    const { userId, email } = event.payload;

    // Step 1: Do work with automatic retries
    const result = await step.do('process user', async () => {
      return { processed: true, userId };
    });

    // Step 2: Wait before next step
    await step.sleep('wait 1 hour', '1 hour');

    // Step 3: Continue workflow
    await step.do('send email', async () => {
      return { sent: true, email };
    });

    return { completed: true, userId };
  }
}

// Worker to trigger workflow
export default {
  async fetch(req: Request, env: Env): Promise<Response> {
    const instance = await env.MY_WORKFLOW.create({
      params: { userId: '123', email: 'user@example.com' }
    });

    return Response.json({
      id: instance.id,
      status: await instance.status()
    });
  }
};
Template: See
templates/basic-workflow.ts
for complete example
src/index.ts:
typescript
import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from 'cloudflare:workers';

type Env = {
  MY_WORKFLOW: Workflow;
};

type Params = {
  userId: string;
  email: string;
};

export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
  async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
    const { userId, email } = event.payload;

    // 步骤1:执行任务并自动重试
    const result = await step.do('process user', async () => {
      return { processed: true, userId };
    });

    // 步骤2:等待后执行下一步
    await step.sleep('wait 1 hour', '1 hour');

    // 步骤3:继续工作流
    await step.do('send email', async () => {
      return { sent: true, email };
    });

    return { completed: true, userId };
  }
}

// 用于触发工作流的Worker
export default {
  async fetch(req: Request, env: Env): Promise<Response> {
    const instance = await env.MY_WORKFLOW.create({
      params: { userId: '123', email: 'user@example.com' }
    });

    return Response.json({
      id: instance.id,
      status: await instance.status()
    });
  }
};
模板:完整示例请查看
templates/basic-workflow.ts

3. Configure wrangler.jsonc

3. 配置wrangler.jsonc

jsonc
{
  "name": "my-workflow",
  "main": "src/index.ts",
  "compatibility_date": "2025-10-22",
  "workflows": [
    {
      "binding": "MY_WORKFLOW",
      "name": "my-workflow",
      "class_name": "MyWorkflow"
    }
  ]
}
Template: See
templates/wrangler-workflows-config.jsonc
jsonc
{
  "name": "my-workflow",
  "main": "src/index.ts",
  "compatibility_date": "2025-10-22",
  "workflows": [
    {
      "binding": "MY_WORKFLOW",
      "name": "my-workflow",
      "class_name": "MyWorkflow"
    }
  ]
}
模板:请查看
templates/wrangler-workflows-config.jsonc

4. Deploy

4. 部署

bash
npm run deploy

bash
npm run deploy

Commands

命令

Interactive slash commands for workflow development:
CommandDescriptionUse When
/workflow-setup
Complete wizard for new workflow projectsStarting new project, need full setup
/workflow-create
Quick scaffolding for workflow classesAdding workflow to existing project
/workflow-debug
Interactive debugging with error patternsTroubleshooting workflow issues
/workflow-test
Test workflows locally and remotelyValidating workflow behavior
Example Usage:
/workflow-setup   # Full guided setup wizard
/workflow-create  # Quick workflow scaffolding
/workflow-debug   # Debug workflow issues
/workflow-test    # Test workflow execution

用于工作流开发的交互式斜杠命令:
命令描述适用场景
/workflow-setup
新工作流项目的完整向导启动新项目,需要完整搭建
/workflow-create
快速生成工作流类框架向现有项目添加工作流
/workflow-debug
结合错误模式的交互式调试排查工作流问题
/workflow-test
本地和远程测试工作流验证工作流行为
示例用法:
/workflow-setup   # 完整引导式搭建向导
/workflow-create  # 快速生成工作流框架
/workflow-debug   # 调试工作流问题
/workflow-test    # 测试工作流执行

Agents

代理

Autonomous agents for complex workflow tasks:
AgentDescriptionTriggers
workflow-debugger
Auto-detects and fixes configuration/runtime errors"debug workflow", "fix workflow errors"
workflow-optimizer
Analyzes performance, cost, and reliability"optimize workflow", "improve performance"
workflow-setup-assistant
Autonomous project scaffolding"setup workflow", "create first workflow"
Key Capabilities:
  • Debugger: 6-phase analysis, auto-fix for I/O context, serialization, export issues
  • Optimizer: Cost analysis, reliability scoring, actionable recommendations
  • Setup Assistant: Project detection, automatic scaffolding, validation

用于复杂工作流任务的自主代理:
代理描述触发条件
workflow-debugger
自动检测并修复配置/运行时错误"debug workflow", "fix workflow errors"
workflow-optimizer
分析性能、成本和可靠性"optimize workflow", "improve performance"
workflow-setup-assistant
自主完成项目搭建"setup workflow", "create first workflow"
核心能力:
  • 调试器:6阶段分析,自动修复I/O上下文、序列化、导出问题
  • 优化器:成本分析、可靠性评分、可执行建议
  • 搭建助手:项目检测、自动生成框架、验证

Scripts

脚本

Automation scripts in
scripts/
directory:
ScriptPurpose
validate-workflow-config.sh
Validate wrangler.jsonc configuration
test-workflow.sh
Create and test workflow instances
benchmark-workflow.sh
Measure performance and cost
generate-workflow.sh
Scaffold new workflows from templates
check-workflow-limits.sh
Validate against Cloudflare limits
Usage:
bash
./scripts/validate-workflow-config.sh           # Check config
./scripts/test-workflow.sh my-workflow          # Test workflow
./scripts/benchmark-workflow.sh my-workflow 10  # Benchmark 10 runs
./scripts/generate-workflow.sh MyWorkflow       # Generate scaffold
./scripts/check-workflow-limits.sh src/workflows/my-workflow.ts

scripts/
目录下的自动化脚本:
脚本用途
validate-workflow-config.sh
验证wrangler.jsonc配置
test-workflow.sh
创建并测试工作流实例
benchmark-workflow.sh
测量性能和成本
generate-workflow.sh
从模板生成新工作流框架
check-workflow-limits.sh
验证是否符合Cloudflare限制
用法:
bash
./scripts/validate-workflow-config.sh           # 检查配置
./scripts/test-workflow.sh my-workflow          # 测试工作流
./scripts/benchmark-workflow.sh my-workflow 10  # 基准测试10次运行
./scripts/generate-workflow.sh MyWorkflow       # 生成框架
./scripts/check-workflow-limits.sh src/workflows/my-workflow.ts

Core Concepts

核心概念

WorkflowEntrypoint

WorkflowEntrypoint

Every workflow must extend
WorkflowEntrypoint
:
typescript
export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
  async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
    // Workflow logic here
  }
}
Key Points:
  • Env
    : Environment bindings (KV, D1, etc.)
  • Params
    : Typed payload passed when creating workflow instance
  • event
    : Contains
    id
    ,
    payload
    ,
    timestamp
  • step
    : Methods for durable execution
每个工作流必须继承
WorkflowEntrypoint
:
typescript
export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
  async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
    // 工作流逻辑写在这里
  }
}
关键点:
  • Env
    : 环境绑定(KV、D1等)
  • Params
    : 创建工作流实例时传入的类型化负载
  • event
    : 包含
    id
    payload
    timestamp
  • step
    : 用于持久化执行的方法

Step Methods

Step方法

All workflow work MUST be done in steps for durability:
typescript
// step.do - Execute work with automatic retries
await step.do('step name', async () => {
  return { result: 'data' };
});

// step.sleep - Wait for duration
await step.sleep('wait', '1 hour');

// step.sleepUntil - Wait until timestamp
await step.sleepUntil('wait until', Date.now() + 3600000);

// step.waitForEvent - Wait for external event
const event = await step.waitForEvent('payment received', 'payment.completed', {
  timeout: '30 minutes'
});
CRITICAL: All I/O (fetch, KV, D1, R2) must happen inside
step.do()
callbacks!
Reference: See
references/workflow-patterns.md
for all patterns

所有工作流任务必须在步骤中执行以保证持久性:
typescript
// step.do - 执行任务并自动重试
await step.do('step name', async () => {
  return { result: 'data' };
});

// step.sleep - 等待指定时长
await step.sleep('wait', '1 hour');

// step.sleepUntil - 等待到指定时间戳
await step.sleepUntil('wait until', Date.now() + 3600000);

// step.waitForEvent - 等待外部事件
const event = await step.waitForEvent('payment received', 'payment.completed', {
  timeout: '30 minutes'
});
关键注意事项:所有I/O操作(fetch、KV、D1、R2)必须在
step.do()
回调内部执行!
参考:所有模式请查看
references/workflow-patterns.md

Critical Rules

关键规则

Always Do ✅

必须遵循 ✅

Perform all I/O inside step.do() - Required for durability ✅ Use named steps - Makes debugging easier ✅ Return JSON-serializable data from steps - Required for state persistence ✅ Use step.sleep() for delays - Don't use setTimeout() ✅ Handle errors explicitly - Use try/catch in step callbacks ✅ Use NonRetryableError for permanent failures - Stops retries
Workflow Patterns: See
references/workflow-patterns.md
for:
  • Sequential workflows
  • Parallel execution
  • Event-driven workflows
  • Scheduled workflows
  • Human-in-the-loop workflows
所有I/O操作放在step.do()内部 - 保证持久性的必要条件 ✅ 使用命名步骤 - 便于调试 ✅ 步骤返回JSON可序列化数据 - 状态持久化的必要条件 ✅ 使用step.sleep()实现延迟 - 不要使用setTimeout() ✅ 显式处理错误 - 在步骤回调中使用try/catch ✅ 对永久失败使用NonRetryableError - 停止重试
工作流模式:请查看
references/workflow-patterns.md
获取以下模式:
  • 顺序工作流
  • 并行执行
  • 事件驱动工作流
  • 定时工作流
  • 人工介入工作流

Never Do ❌

禁止操作 ❌

Never do I/O outside step.do() - Will fail with "I/O context" error ❌ Never use setTimeout() or setInterval() - Use step.sleep() instead ❌ Never return non-serializable data - Functions, Promises, etc. will fail ❌ Never hardcode timeouts - Use workflow config ❌ Never ignore NonRetryableError - Indicates permanent failure

绝对不要在step.do()外部执行I/O - 会触发"I/O context"错误 ❌ 绝对不要使用setTimeout()或setInterval() - 请使用step.sleep()替代 ❌ 绝对不要返回不可序列化数据 - 函数、Promise等会导致失败 ❌ 绝对不要硬编码超时时间 - 使用工作流配置 ❌ 绝对不要忽略NonRetryableError - 表示永久失败

Top 5 Critical Errors

常见错误Top5

Error #1: I/O Context Error ⚠️

错误1:I/O上下文错误 ⚠️

Error:
Cannot perform I/O on behalf of a different request
Cause: Performing I/O outside
step.do()
callback
Solution:
typescript
// ❌ WRONG
const data = await fetch('https://api.example.com');
await step.do('use data', async () => {
  return data; // Error!
});

// ✅ CORRECT
const data = await step.do('fetch data', async () => {
  const response = await fetch('https://api.example.com');
  return await response.json();
});
错误信息:
Cannot perform I/O on behalf of a different request
原因: 在
step.do()
回调外部执行I/O操作
解决方案:
typescript
// ❌ 错误写法
const data = await fetch('https://api.example.com');
await step.do('use data', async () => {
  return data; // 错误!
});

// ✅ 正确写法
const data = await step.do('fetch data', async () => {
  const response = await fetch('https://api.example.com');
  return await response.json();
});

Error #2: Serialization Error

错误2:序列化错误

Error:
Cannot serialize workflow state
Cause: Returning non-JSON-serializable data from step
Solution:
typescript
// ❌ WRONG
await step.do('process', async () => {
  return { fn: () => {} }; // Functions not serializable
});

// ✅ CORRECT
await step.do('process', async () => {
  return { result: 'data' }; // JSON-serializable
});
错误信息:
Cannot serialize workflow state
原因: 步骤返回了非JSON可序列化的数据
解决方案:
typescript
// ❌ 错误写法
await step.do('process', async () => {
  return { fn: () => {} }; // 函数不可序列化
});

// ✅ 正确写法
await step.do('process', async () => {
  return { result: 'data' }; // JSON可序列化
});

Error #3: NonRetryableError Not Thrown

错误3:未抛出NonRetryableError

Error: Workflow retries forever on permanent failures
Solution:
typescript
import { NonRetryableError } from 'cloudflare:workers';

await step.do('validate', async () => {
  if (!isValid) {
    throw new NonRetryableError('Invalid input'); // Stop retries
  }
  return { valid: true };
});
问题: 工作流在永久失败时无限重试
解决方案:
typescript
import { NonRetryableError } from 'cloudflare:workers';

await step.do('validate', async () => {
  if (!isValid) {
    throw new NonRetryableError('Invalid input'); // 停止重试
  }
  return { valid: true };
});

Error #4: WorkflowEvent Not Found

错误4:WorkflowEvent未找到

Error:
WorkflowEvent 'payment.completed' not found
Cause: Event name mismatch between
waitForEvent
and trigger
Solution:
typescript
// Workflow waits for event
const event = await step.waitForEvent('wait payment', 'payment.completed', {
  timeout: '30 minutes'
});

// Trigger event with EXACT same name
await instance.trigger('payment.completed', { amount: 100 });
错误信息:
WorkflowEvent 'payment.completed' not found
原因:
waitForEvent
和触发事件的名称不匹配
解决方案:
typescript
// 工作流等待事件
const event = await step.waitForEvent('wait payment', 'payment.completed', {
  timeout: '30 minutes'
});

// 触发事件时使用完全一致的名称
await instance.trigger('payment.completed', { amount: 100 });

Error #5: Workflow Execution Failed

错误5:工作流执行失败

Error:
Workflow execution failed: Step timeout exceeded
Cause: Step exceeds maximum CPU time (30 seconds)
Solution:
typescript
// ❌ WRONG
await step.do('long task', async () => {
  for (let i = 0; i < 1000000; i++) {
    // Long computation
  }
});

// ✅ CORRECT - Break into smaller steps
for (let i = 0; i < 100; i++) {
  await step.do(`batch ${i}`, async () => {
    // Process batch
  });
}

All Issues: See
references/common-issues.md
for complete documentation

错误信息:
Workflow execution failed: Step timeout exceeded
原因: 步骤超出最大CPU时间(30秒)
解决方案:
typescript
// ❌ 错误写法
await step.do('long task', async () => {
  for (let i = 0; i < 1000000; i++) {
    // 长时间计算
  }
});

// ✅ 正确写法 - 拆分为更小的步骤
for (let i = 0; i < 100; i++) {
  await step.do(`batch ${i}`, async () => {
    // 处理批次
  });
}

所有问题:完整文档请查看
references/common-issues.md

Common Patterns

通用模式

Sequential Workflow

顺序工作流

Basic workflow with steps executing in order. Each step completes before the next begins.
Use cases: Order processing, user onboarding, data pipelines
Load
templates/basic-workflow.ts
for complete example
步骤按顺序执行的基础工作流。每个步骤完成后才会执行下一步。
适用场景:订单处理、用户注册、数据管道
完整示例请加载
templates/basic-workflow.ts

Scheduled Workflow

定时工作流

Workflow with time delays between steps using
step.sleep()
or
step.sleepUntil()
.
Use cases: Reminder sequences, scheduled tasks, delayed notifications
Load
templates/scheduled-workflow.ts
for complete example
使用
step.sleep()
step.sleepUntil()
在步骤间设置时间延迟的工作流。
适用场景:提醒序列、定时任务、延迟通知
完整示例请加载
templates/scheduled-workflow.ts

Event-Driven Workflow

事件驱动工作流

Wait for external events with
step.waitForEvent()
. Always set timeout and handle with
NonRetryableError
:
typescript
const payment = await step.waitForEvent('wait payment', 'payment.completed', {
  timeout: '30 minutes'
});
if (!payment) throw new NonRetryableError('Payment timeout');
Load
templates/workflow-with-events.ts
for complete example
使用
step.waitForEvent()
等待外部事件。必须设置超时时间并使用
NonRetryableError
处理超时:
typescript
const payment = await step.waitForEvent('wait payment', 'payment.completed', {
  timeout: '30 minutes'
});
if (!payment) throw new NonRetryableError('Payment timeout');
完整示例请加载
templates/workflow-with-events.ts

Workflow with Retries

带重试的工作流

Use
NonRetryableError
for permanent failures (404), regular
Error
for transient failures (5xx):
typescript
const data = await step.do('fetch', async () => {
  const response = await fetch(url);
  if (!response.ok) {
    if (response.status === 404) throw new NonRetryableError('Not found');
    throw new Error('Temporary failure'); // Will retry
  }
  return await response.json();
});
Load
templates/workflow-with-retries.ts
for complete example with retry configuration

对永久失败(如404)使用
NonRetryableError
,对临时失败(如5xx)使用常规
Error
typescript
const data = await step.do('fetch', async () => {
  const response = await fetch(url);
  if (!response.ok) {
    if (response.status === 404) throw new NonRetryableError('Not found');
    throw new Error('Temporary failure'); // 会重试
  }
  return await response.json();
});
带重试配置的完整示例请加载
templates/workflow-with-retries.ts

Triggering Workflows

触发工作流

From Worker: Create instances via
env.MY_WORKFLOW.create()
, get status with
instance.status()
, trigger events with
instance.trigger()
.
From Cron: Use
scheduled()
handler to create workflow instances on schedule.
Load
templates/worker-trigger.ts
for complete Worker trigger example
Load
templates/scheduled-workflow.ts
for complete Cron trigger example

从Worker触发:通过
env.MY_WORKFLOW.create()
创建实例,使用
instance.status()
获取状态,使用
instance.trigger()
触发事件。
从Cron触发:使用
scheduled()
处理程序定时创建工作流实例。
Worker触发完整示例请加载
templates/worker-trigger.ts
Cron触发完整示例请加载
templates/scheduled-workflow.ts

When to Load References

何时查阅参考文档

references/common-issues.md
: Encountering I/O context, serialization, NonRetryableError, event naming, or timeout errors; troubleshooting workflow failures.
references/workflow-patterns.md
: Building complex orchestration, approval workflows, idempotency patterns, or circuit breaker patterns.
references/wrangler-commands.md
: Need CLI commands for managing workflow instances, debugging stuck workflows, or monitoring production.
references/production-checklist.md
: Preparing for deployment, need pre-deployment verification, setting up monitoring/error handling.
references/limits-quotas.md
: Hitting instance/step/payload limits, optimizing for cost, designing high-volume workflows.
references/2025-features.md
: Using events system, enhanced retries, instance lifecycle control, or latest Workflows features.
references/metrics-analytics.md
: Setting up monitoring, custom metrics, external logging integration, or workflow dashboards.
references/troubleshooting.md
: Complex debugging scenarios, stuck instances, systematic diagnosis, performance issues.
templates/
: basic-workflow.ts (sequential), scheduled-workflow.ts (delays/sleep), workflow-with-events.ts (waitForEvent), workflow-with-retries.ts (custom retry), worker-trigger.ts (Worker triggers), wrangler-workflows-config.jsonc (Wrangler config), parallel-execution-workflow.ts (batched parallel processing), circuit-breaker-workflow.ts (resilient external calls)

references/common-issues.md
:遇到I/O上下文、序列化、NonRetryableError、事件命名或超时错误;排查工作流故障。
references/workflow-patterns.md
:构建复杂编排、审批工作流、幂等模式或断路器模式。
references/wrangler-commands.md
:需要CLI命令管理工作流实例、调试卡住的工作流或监控生产环境。
references/production-checklist.md
:准备部署,需要预部署验证、设置监控/错误处理。
references/limits-quotas.md
:达到实例/步骤/负载限制,优化成本,设计高流量工作流。
references/2025-features.md
:使用事件系统、增强重试、实例生命周期控制或最新Workflows功能。
references/metrics-analytics.md
:设置监控、自定义指标、外部日志集成或工作流仪表板。
references/troubleshooting.md
:复杂调试场景、卡住的实例、系统诊断、性能问题。
templates/
basic-workflow.ts(顺序)、scheduled-workflow.ts(延迟/休眠)、workflow-with-events.ts(waitForEvent)、workflow-with-retries.ts(自定义重试)、worker-trigger.ts(Worker触发)、wrangler-workflows-config.jsonc(Wrangler配置)、parallel-execution-workflow.ts(批量并行处理)、circuit-breaker-workflow.ts(弹性外部调用)

Wrangler Commands

Wrangler命令

Key Commands:
wrangler workflows create
,
wrangler workflows instances list/describe/terminate
,
wrangler deploy
Load
references/wrangler-commands.md
for complete CLI reference with all workflow management commands, monitoring workflows, and debugging stuck instances.

核心命令
wrangler workflows create
wrangler workflows instances list/describe/terminate
wrangler deploy
完整CLI参考请加载
references/wrangler-commands.md
,包含所有工作流管理命令、工作流监控和卡住实例调试方法。

State Persistence

状态持久化

Workflows automatically persist state between steps. No manual state management needed:
typescript
export class StatefulWorkflow extends WorkflowEntrypoint {
  async run(event, step) {
    // Step 1 result is automatically persisted
    const result1 = await step.do('step 1', async () => {
      return { data: 'value' };
    });

    // Even if workflow crashes here, step 1 won't re-run
    await step.sleep('wait', '1 hour');

    // Step 2 can use step 1's result (still available after sleep)
    await step.do('step 2', async () => {
      console.log(result1.data); // 'value' - persisted!
    });
  }
}
Key Points:
  • Step results automatically persisted
  • Completed steps never re-run (even after crash/restart)
  • State available throughout workflow lifetime

工作流会自动在步骤间持久化状态,无需手动管理状态:
typescript
export class StatefulWorkflow extends WorkflowEntrypoint {
  async run(event, step) {
    // 步骤1的结果会自动持久化
    const result1 = await step.do('step 1', async () => {
      return { data: 'value' };
    });

    // 即使工作流在此处崩溃,步骤1也不会重新执行
    await step.sleep('wait', '1 hour');

    // 步骤2可以使用步骤1的结果(休眠后仍然可用)
    await step.do('step 2', async () => {
      console.log(result1.data); // 'value' - 已持久化!
    });
  }
}
关键点:
  • 步骤结果自动持久化
  • 已完成的步骤永远不会重新执行(即使崩溃/重启后)
  • 状态在整个工作流生命周期内可用

Limits

限制

ResourceLimit
Step CPU Time30 seconds
Workflow Duration30 days
Step Payload Size128 KB
Workflow Payload Size128 KB
Steps per Workflow1,000
Concurrent Instances1,000 per workflow
Event Payload Size128 KB
Workarounds:
  • Large data: Store in KV/R2, pass key in step
  • Long CPU: Break into smaller steps
  • Many steps: Consider sub-workflows
资源限制
步骤CPU时间30秒
工作流持续时间30天
步骤负载大小128 KB
工作流负载大小128 KB
每个工作流的步骤数1000
并发实例数每个工作流1000个
事件负载大小128 KB
解决方法:
  • 大数据:存储在KV/R2中,在步骤中传递密钥
  • 长时间CPU任务:拆分为更小的步骤
  • 大量步骤:考虑使用子工作流

Pricing

定价

  • Duration: $0.02 per million GB-s (same as Workers)
  • Requests: $0.15 per million (workflow creation + step execution)
  • State Storage: Included (no additional cost)
  • Sleep: Free (no CPU usage during sleep)
Example Cost (1M workflow runs):
  • 5 steps each = 5M requests = $0.75
  • 10ms per step = 50GB-s = $0.001
  • Total: ~$0.75 per million workflows

  • 持续时间:每百万GB-s 0.02美元(与Workers相同)
  • 请求:每百万次0.15美元(工作流创建 + 步骤执行)
  • 状态存储:包含在内(无额外费用)
  • 休眠:免费(休眠期间无CPU使用)
示例成本(100万次工作流运行):
  • 每次5个步骤 = 500万次请求 = 0.75美元
  • 每个步骤10ms = 50GB-s = 0.001美元
  • 总计:约每百万次工作流0.75美元

Troubleshooting

故障排查

"I/O context" error

"I/O context"错误

Solution: Move all I/O into
step.do()
callbacks → See
references/common-issues.md
#1
解决方案:将所有I/O操作移至
step.do()
回调内部 → 查看
references/common-issues.md
#1

"Serialization error"

"Serialization error"

Solution: Return only JSON-serializable data from steps → See
references/common-issues.md
#2
解决方案:步骤仅返回JSON可序列化数据 → 查看
references/common-issues.md
#2

Workflow retries forever

工作流无限重试

Solution: Throw
NonRetryableError
for permanent failures → See
references/common-issues.md
#3
解决方案:对永久失败抛出
NonRetryableError
→ 查看
references/common-issues.md
#3

"WorkflowEvent not found"

"WorkflowEvent not found"

Solution: Ensure event names match exactly → See
references/common-issues.md
#4
解决方案:确保事件名称完全匹配 → 查看
references/common-issues.md
#4

"Step timeout exceeded"

"Step timeout exceeded"

Solution: Break long computations into smaller steps → See
references/common-issues.md
#5

解决方案:将长时间计算拆分为更小的步骤 → 查看
references/common-issues.md
#5

Production Checklist

生产环境检查清单

10-Point Pre-Deployment Checklist: I/O context isolation, JSON serialization, NonRetryableError usage, event name consistency, step duration limits, error handling, retry configuration, timeouts, workflow naming, and monitoring.
Load
references/production-checklist.md
for complete checklist with detailed explanations, code examples, verification steps, and deployment workflow.

10点预部署检查清单:I/O上下文隔离、JSON序列化、NonRetryableError使用、事件名称一致性、步骤持续时间限制、错误处理、重试配置、超时设置、工作流命名和监控。
完整检查清单请加载
references/production-checklist.md
,包含详细说明、代码示例、验证步骤和部署流程。

Official Documentation

官方文档