

# 基本概念
<a name="durable-basic-concepts"></a>

AWS 耐用执行 SDK 是构建耐用函数的基础，提供了记录进度检查点、处理重试和管理执行流所需的基元。该 SDK 支持 JavaScript/TypeScript、Python 和 Java。有关完整的 SDK 文档，包括 API 参考、快速入门教程和特定语言的指南，请参阅 [AWS 耐用执行 SDK 开发人员指南](https://docs.aws.amazon.com/durable-execution/)。

## 持久执行
<a name="durable-execution-concept"></a>

**持久执行**代表了 Lambda 持久性函数的整个生命周期，它通过检查点和回放机制来跟踪业务逻辑的执行进度、暂停执行以及从故障中恢复。当函数在暂停或中断后恢复时，会回放之前完成的检查点，然后函数继续执行。

该生命周期可能包括多次调用 Lambda 函数以完成执行，尤其是在暂停或故障恢复之后。这种方法使您的函数能够长时间运行（最长一年），同时即使出现中断，也能保持可靠的进度。

**重播的工作原理**  
Lambda 会持续记录所有持久操作（步骤、等待以及其他操作）的执行过程，直至您的函数完成执行。当您的函数需要暂停或遇到中断时，Lambda 会保存此检查点日志并停止执行。当需要恢复时，Lambda 会从头开始再次调用您的函数并重播检查点日志，从而用存储的值替代已完成的操作。这意味着您的代码会再次运行，但之前已完成的步骤不会再次执行。而是会使用它们存储的结果。

这种重播机制是理解持久性函数的基础。您的代码在重播期间必须是确定性的，也就是说，对于相同的输入，它会产生相同的输出结果。避免在步骤之外进行会产生副作用的操作（例如生成随机数或获取当前时间），因为这些操作在重播时可能会产生不同的结果，从而导致非确定性行为。

## DurableContext
<a name="durable-context-concept"></a>

**DurableContext** 是您的持久性函数接收的上下文对象。它提供了持久操作的方法，例如创建检查点和管理执行流的步骤和等待。

您的持久性函数会接收 `DurableContext` 而不是默认的 Lambda 上下文：

------
#### [ TypeScript ]

```
import {
  DurableContext,
  withDurableExecution,
} from "@aws/durable-execution-sdk-js";

export const handler = withDurableExecution(
  async (event: any, context: DurableContext) => {
    const result = await context.step(async () => {
      return "step completed";
    });
    return result;
  },
);
```

------
#### [ Python ]

```
from aws_durable_execution_sdk_python import (
    DurableContext,
    durable_execution,
    durable_step,
)

@durable_step
def my_step(step_context, data):
    # Your business logic
    return result

@durable_execution
def handler(event, context: DurableContext):
    result = context.step(my_step(event["data"]))
    return result
```

------

通过 `DurableContext`，您的函数可以访问耐用的操作，这些操作可以记录进度检查点并协调工作：
+ **Step** 通过内置重试和自动检查点机制运行业务逻辑。每个步骤都会保存其结果，这样即使出现中断情况，您的函数也能从最后完成的步骤处恢复执行。
+ **Wait** 是计划中的暂停，这时，您的函数会停止运行并停止收费，直到需要继续运行时。将这些操作用于时间段、外部回调或条件轮询。
+ **Invoke** 调用其他 Lambda 函数并检查结果。调用的函数可以是标准函数，也可以是耐用函数。不支持跨账户调用。

有关所有可用耐用操作的完整语言参考，请参阅《AWS 耐用执行 SDK 开发人员指南》中的 [SDK 参考](https://docs.aws.amazon.com/durable-execution/sdk-reference/)。

## 持久性函数配置
<a name="durable-configuration-basic"></a>

持久性函数具有控制执行行为和数据留存的特定配置设置。这些设置独立于标准的 Lambda 函数配置，并且适用于整个持久执行生命周期。

**DurableConfig** 对象用于定义持久性函数的配置：

```
{
  "ExecutionTimeout": Integer,
  "RetentionPeriodInDays": Integer
}
```

### Execution timeout (执行超时)
<a name="durable-execution-timeout"></a>

**执行超时**用于控制持久执行从开始到完成的运行时长。该超时与 Lambda 函数的超时不同，后者用于控制单次函数调用的运行时长。

在其经历检查点、等待和重播的过程中，一个持久执行过程能够跨越多次 Lambda 函数调用。执行超时时间适用于持久执行的总耗时，而非针对每个函数调用而言。

**了解差异**  
Lambda 函数超时时间（最长 15 分钟）会限制您函数的每次调用。持久执行超时（最长 1 年）限制从执行开始到执行完成、失败或超时的总时长。在此期间，由于您的函数会处理步骤、等待和从故障中恢复，可能会被多次调用。

例如，如果您将持久执行超时设置为 24 小时，并将 Lambda 函数超时设置为 5 分钟：
+ 每次函数调用必须在 5 分钟内完成
+ 整个持久执行最多可以运行 24 小时
+ 在这 24 小时内，您的函数可能会被多次调用
+ 等待操作不计入 Lambda 函数超时，但会计入执行超时

在使用 Lambda 控制台、AWS CLI 或 AWS SAM 创建持久性函数时，您可以配置执行超时。在 Lambda 控制台中，选择您的函数，然后选择“配置”“持久执行”。以秒为单位设置执行超时值（默认值：86400 秒/24 小时，最小值：60 秒，最大值：31536000 秒/1 年）。

**注意**  
执行超时和 Lambda 函数超时是不同的设置。Lambda 函数超时控制每次单独调用所能运行的最长时间（最长为 15 分钟）。执行超时控制整个持久执行的总耗时（最长 1 年）。

### 保留期
<a name="durable-retention-period"></a>

**保留期**控制 Lambda 在持久执行完成后将执行历史记录和检查点数据保留的时长。此数据包括步骤结果、执行状态以及完整的检查点日志。

保留期过期后，Lambda 将删除执行历史记录和检查点数据。您无法再检索执行详细信息或重播执行。保留期从执行达到终端状态（SUCCEEDED、FAILED、STOPPED 或 TIMED\_OUT）时开始。

在使用 Lambda 控制台、AWS CLI 或 AWS SAM 创建持久性函数时，您可以配置保留期。在 Lambda 控制台中，选择您的函数，然后选择“配置”“持久执行”。以天为单位设置保留期值（默认值：14 天，最小值：1 天，最大值：90 天）。

根据您的合规性要求、调试需求和成本考虑因素选择保留期。保留期越长，为调试和审计提供的时间越多，但会增加存储成本。

## 另请参阅
<a name="durable-basic-concepts-see-also"></a>
+ [AWS 耐用执行 SDK 开发人员指南](https://docs.aws.amazon.com/durable-execution/) – 完整的 SDK 参考、快速入门教程、测试框架和特定语言的指南。
+ [持久性函数或 Step Functions](durable-step-functions.md)：比较持久性函数与 Step Functions，了解每种方法何时最有效。