幂等性
持久性函数通过执行名称为执行启动提供内置的幂等性。当您提供执行名称时,Lambda 会利用该名称来防止重复执行,并确保调用请求能够安全地进行重试。步骤默认具有至少一次的执行语义。在重放过程中,SDK 会返回已检查的结果,而不会重新执行已完成的步骤,但您的业务逻辑必须是幂等性的,以便在完成之前处理可能的重试情况。
注意
Lambda 事件源映射(ESM)在启动时不支持幂等性。因此,每次调用(包括重试)都会启动一个新的持久执行。为确保事件源映射下的执行具有幂等性,可以在您的函数代码中实施幂等性逻辑,例如使用 Powertools for AWS Lambda 来实施,或者使用常规的 Lambda 函数作为代理(调度程序)来调用具有幂等键(执行名称参数)的持久性函数。
执行名称
在调用持久性函数时,您可以提供一个执行名称。执行名称充当幂等键,使您能够安全地重试调用请求,而无需创建重复的执行。如果您不提供名称,Lambda 会自动生成一个唯一的执行 ID。
执行名称必须在您的账户和区域内唯一。当您使用已存在的执行名称调用函数时,Lambda 的行为将取决于现有执行的状态以及有效载荷是否与之匹配。
幂等性行为
以下表格说明了 Lambda 如何根据您是否提供了执行名称、现有执行状态以及有效载荷是否匹配等因素来处理调用请求:
| 场景 | 是否提供了名称? | 现有执行状态 | 有效载荷相同? | 行为 |
|---|---|---|---|---|
| 1 | 否 | 不适用 | 不适用 | 新执行已开始:Lambda 生成一个唯一的执行 ID 并开始新的执行 |
| 2 | 可以 | 从未存在或保留期已过期 | 不适用 | 新执行已开始:Lambda 使用提供的名称开始新执行 |
| 3 | 是 | 运行 | 是 | 幂等性启动:Lambda 返回现有的执行信息,而不会启动重复的执行过程。对于同步调用而言,这相当于是重新附加到正在运行的执行 |
| 4 | 是 | 运行 | 否 | 错误:Lambda 返回 DurableExecutionAlreadyExists 错误,因为具有此名称的执行已经在运行,且具有不同的有效载荷 |
| 5 | 是 | 已关闭(成功、失败、停止或超时) | 是 | 幂等性启动:Lambda 返回现有的执行信息,而不会启动新执行。将返回已关闭执行的结果 |
| 6 | 是 | 已关闭(成功、失败、停止或超时) | 否 | 错误:Lambda 返回 DurableExecutionAlreadyExists 错误,因为具有此名称的执行已经在运行,且具有不同的有效载荷 |
注意
场景 3 和方案 5 展示了幂等性行为,其中 Lambda 能够安全地处理重复的调用请求,它会返回现有的执行信息,而非创建重复项。
步骤幂等性
步骤默认具有至少一次的执行语义。当您的函数在等待、回调或出现故障后重放时,SDK 会将每个步骤与检查点日志进行比对。对于已经完成的步骤,SDK 会返回已进行检查点保存的结果,但不会重新执行该步骤逻辑。但是,如果某个步骤失败或者在该步骤完成之前函数被中断,则该步骤可能会执行多次。
您的步骤中的业务逻辑必须是幂等性的,以便能够处理可能的重试情况。使用幂等键来确保诸如支付或数据库写入等操作仅执行一次,即便该步骤出现重试情况也是如此。有关如何为幂等性编写代码的详细信息,请参阅《AWS 耐用执行 SDK 开发人员指南》中的幂等性和重试。