AWS Lambda Durable Functions:构建持久工作流
Source: Dev.to
什么是 Durable Functions?
Durable Functions 是可以暂停和恢复的 Lambda 函数。当函数等待回调或休眠一小时时,Lambda 会对其状态进行检查点并停止执行。到需要继续时,Lambda 会在原地恢复——所有变量和上下文保持完整。
这并不是一种全新的计算模型。它是普通的 Lambda,只是自动管理了状态。你编写普通的 async/await 代码,Lambda 会让它变得持久化。
一个简单示例
下面是一个工作流示例:创建订单,等待 5 分钟,然后发送通知:
import { DurableContext, withDurableExecution } from '@aws/durable-execution-sdk-js';
export const handler = withDurableExecution(
async (event: any, context: DurableContext) => {
const order = await context.step('create-order', async () => {
return createOrder(event.items);
});
await context.wait({ seconds: 300 });
await context.step('send-notification', async () => {
return sendEmail(order.customerId, order.id);
});
return { orderId: order.id, status: 'completed' };
}
);
就是这么简单。无需配置状态机、管理数据库或编写轮询循环。函数在等待期间会暂停,空闲时不产生费用,并在 5 分钟后自动恢复。
关键能力
- 超长执行时间 – 工作流最长可运行 1 年。单次调用仍受 15 分钟限制,但工作流会跨多次调用继续。
- 自动检查点 – Lambda 在每一步保存函数状态。如果出现故障,函数会从最近的检查点恢复,而不是从头开始。
- 内置重试 – 可配置指数退避的重试策略。Lambda 自动处理重试逻辑和时机。
- 等待回调 – 在外部事件到达前暂停执行。非常适合人工审批、Webhook 响应或异步 API 结果。
- 并行执行 – 同时运行多个操作并等待全部完成。Lambda 负责协调。
- 嵌套工作流 – 调用其他 Durable Functions,将简单构件组合成复杂工作流。
工作原理:Replay 模型
Durable Functions 使用基于重放的执行模型。当函数恢复时,Lambda 会从头“重放”函数——但不是重新执行操作,而是使用已检查点的结果。
首次调用 – 函数运行,执行每一步并记录检查点。
等待或回调 – 函数暂停;Lambda 保存状态并停止执行。
恢复 – Lambda 再次调用函数,从头重放。
重放 – 操作立即返回检查点结果,而不是重新执行。
继续 – 函数在保持完整上下文的情况下继续执行等待之后的逻辑。
该模型确保函数始终看到一致的状态,即使出现问题或重启。操作必须是确定性的——它们只执行一次,重放时返回相同结果。
了解更多: Understanding the Replay Model
常见使用场景
- 审批工作流 – 在继续之前等待人工批准。函数会暂停,直到有人点击“批准”或“拒绝”。
- Saga 模式 – 协调分布式事务并执行补偿操作。如果某一步失败,自动回滚之前的步骤。
- 定时任务 – 等待特定时间或间隔。比如在午夜处理数据、在 24 小时后发送提醒,或每 5 分钟重试一次。
- API 编排 – 调用多个 API 并进行重试和错误处理。协调响应并优雅地处理部分失败。
- 数据处理管道 – 将大数据集分阶段处理并设置检查点。如果某阶段失败,可从上一次成功的阶段恢复。
- 事件驱动工作流 – 响应外部事件,如 webhook、IoT 信号或用户操作。等待事件并在到达时继续处理。
测试你的工作流
测试长时间运行的工作流并不意味着要等上数小时。Durable Execution SDK 包含一个测试库,可在本地毫秒级运行函数:
import { LocalDurableTestRunner } from '@aws/durable-execution-sdk-js-testing';
const runner = new LocalDurableTestRunner({
handlerFunction: handler,
});
const execution = await runner.run();
expect(execution.getStatus()).toBe('SUCCEEDED');
expect(execution.getResult()).toEqual({ orderId: '123', status: 'completed' });
测试运行器会模拟检查点、跳过基于时间的等待,并让你检查每个操作。你可以在不部署到 AWS 的情况下测试回调、重试和失败情况。
了解更多: Testing Durable Functions
使用 AWS SAM 部署
使用 AWS SAM 部署 Durable Functions,只需几个关键配置:
Resources:
OrderProcessorFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: src/order-processor
Handler: index.handler
Runtime: nodejs22.x
DurableConfig:
ExecutionTimeout: 900
RetentionPeriodInDays: 7
Metadata:
BuildMethod: esbuild
BuildProperties:
EntryPoints:
- index.ts
DurableConfig 属性启用持久化执行并设置工作流超时时间。SAM 会自动处理检查点和状态管理所需的 IAM 权限。
了解更多: Deploying Durable Functions with SAM
何时使用 Durable Functions
- 工作流跨多个步骤并包含等待或回调。
- 需要带指数退避的自动重试。
- 想要协调多个异步操作。
- 流程需要人工批准或外部事件。
- 需要处理长时间运行的任务而不管理状态。
- 更倾向于用代码而非配置来编写工作流。
入门指南
- 安装 SDK
npm install @aws/durable-execution-sdk-js - 编写函数 – 用
withDurableExecution()包装你的处理器。 - 使用持久化操作 –
context.step()、context.wait()、context.waitForCallback()。 - 本地测试 – 使用
LocalDurableTestRunner快速迭代。 - 使用 SAM 部署 – 在模板中添加
DurableConfig。 - 监控执行 – 使用 Amazon CloudWatch 和 AWS X‑Ray 进行可观测性。
学习更多
- Understanding the Replay Model – 深入了解 Durable Functions 的内部工作原理。
- Testing Durable Functions – 完整的测试指南。
- Deploying Durable Functions with SAM – 模板配置、权限和部署最佳实践。