AWS近期正式发布了用于Lambda的Durable Functions功能。这项新能力允许开发者使用标准的Lambda函数来构建复杂的多步骤应用(工作流)。
该功能的核心特性在于,它可以跟踪执行进度,在失败时自动重试,并能在定义的节点暂停执行长达1年,且在等待期间不会产生闲置的计算成本。其设计目标是让开发者能够完全在函数代码中表达有状态的应用程序逻辑,而无需关心底层的状态机。
AWS首席开发者布道师Donnie Prakoso解释道,在启用函数的持久化执行后,开发者只需将新的开源持久化执行SDK添加到函数代码中。随后,开发者便可以使用SDK中的“步骤”和“等待”等原语——前者可为业务逻辑自动添加检查点和重试机制,后者则能在不产生计算费用的前提下高效地暂停执行。
Lambda持久化函数引入了两个核心原语来处理状态管理和恢复。第一个是步骤,通过 context.step() 方法实现,它为开发者编写的业务逻辑自动添加了重试和检查点功能。当一个步骤完成后,在重放过程中将被跳过。第二个是等待,通过 context.wait() 方法实现,它让执行暂停指定时长,终止函数并在不产生计算费用的情况下挂起和恢复执行。
一个持久化函数的示例如下所示:
import { DurableContext, withDurableExecution } from "@aws/durable-execution-sdk-js";
export const handler = withDurableExecution(
async (event: any, context: DurableContext) => {
const { orderId, amount, items } = event;
// 在多个仓库中预留库存
const inventory = await context.step("reserve-inventory", async () => {
return await inventoryService.reserve(items);
});
// 处理支付
const payment = await context.step("process-payment", async () => {
return await paymentService.charge(amount);
});
// 创建物流单
const shipment = await context.step("create-shipment", async () => {
return await shippingService.createShipment(orderId, inventory);
});
return { orderId, status: 'completed', shipment };
}
);
这一发布立即引发了与AWS Step Functions的比较,后者传统上使用YAML定义来处理复杂的云原生服务编排。Datadog的Staff工程师、AWS Hero AJ Stuyvenberg在LinkedIn上评论道,持久化函数与Step Functions非常相似,但完全通过代码而非YAML步骤定义来表达。开发者可以在状态间转换、重试失败,甚至可以暂停/恢复长达一年,同时依然使用现有的Lambda事件模型。
社区中也有类似的观点,一位Hacker News的参与者指出,这基本上就是一个在共享数据库中(对开发者透明)对步骤进展进行“检查点”的应用。它比同等的Step Functions实现要简单得多,不那么“神奇”,也更便宜。
此外,持久化函数还提供了其他操作以支持更复杂的模式:create_callback()用于创建回调,开发者可借此等待外部事件(如API响应或人工审批)的结果;wait_for_condition()用于暂停执行,直到满足特定条件(例如轮询REST API直至流程完成);以及用于高级并发场景的 parallel() 或 map() 操作。
Mike Roberts指出了这项功能如何解决了一个长期存在的微服务架构挑战:在此功能发布前,他通常会建议使用Step Function。但如果大部分逻辑已经存在于应用代码中,这常常会让人感到不便。持久化函数通过“可重入”特性(AWS会为同一个请求多次运行Lambda函数),并处理前几次运行的状态以使代码回到需要的位置,从而解决了这一问题。因此,现在一个请求的执行总时间可以超过15分钟,只要Lambda函数每次调用的“活跃”时间不超过15分钟即可。
Reply公司的高级顾问Alexey Vidanov提到,借助Lambda持久化函数,开发者现在可以在Lambda中运行缓慢或链式的LLM步骤,而无需支付等待成本、启动容器或管理额外的计算路径。Lambda持久化函数将编排直接引入Lambda。这消除了基于时间的成本,并为LLM、ML和智能体工作流解锁了更清晰的模型。
值得注意的是,微软Azure等竞争对手已经提供了类似的功能——Azure Durable Functions,且已有数年。Jason Miles在LinkedIn的帖子中提到了这一背景。他表示,持久化函数在Azure上已经存在一段时间了。它们确实有适用的场景,但开发者真的应该评估一个15分钟的运行是否是合适的解决方案。偶尔使用或许可以,但如果经常需要等待(这是最常见的情况之一),则可能需要进一步分解任务。
目前,Lambda持久化函数已在美国东部(俄亥俄)AWS区域可用,支持JavaScript/TypeScript(Node.js 22/24)和Python(3.13/3.14)。具体定价信息可参阅专门的定价页面。