AWS Lambda Durable Functions:构建持久工作流

发布: (2025年12月4日 GMT+8 05:33)
7 min read
原文: Dev.to

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

  • 工作流跨多个步骤并包含等待或回调。
  • 需要带指数退避的自动重试。
  • 想要协调多个异步操作。
  • 流程需要人工批准或外部事件。
  • 需要处理长时间运行的任务而不管理状态。
  • 更倾向于用代码而非配置来编写工作流。

入门指南

  1. 安装 SDK
    npm install @aws/durable-execution-sdk-js
  2. 编写函数 – 用 withDurableExecution() 包装你的处理器。
  3. 使用持久化操作context.step()context.wait()context.waitForCallback()
  4. 本地测试 – 使用 LocalDurableTestRunner 快速迭代。
  5. 使用 SAM 部署 – 在模板中添加 DurableConfig
  6. 监控执行 – 使用 Amazon CloudWatch 和 AWS X‑Ray 进行可观测性。

学习更多

Back to Blog

相关文章

阅读更多 »

被遗忘的 tech 墓地 by kiroween

一次 Hackathon 之旅:走进旧发明的墓园 每年十月,创意世界里总会掀起一阵奇异的波动。今年,Kiroween 发起挑战,……