

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

持久执行 SDK 是构建持久性函数的基础。该指南提供了为进度创建检查点、处理重试和管理执行流所需的基元。该 SDK 简化了检查点管理与回放的复杂性，使您能够编写具有自动容错功能的顺序代码。

该 SDK 支持 JavaScript、TypeScript、Python 和 Java。有关完整的 API 文档、快速入门教程和特定语言的指南，请参阅 [AWS 耐用执行 SDK 开发人员指南](https://docs.aws.amazon.com/durable-execution/)。

## 该 SDK 的用途
<a name="durable-sdk-what-it-does"></a>

**检查点管理：**当您的函数执行持久操作时，该 SDK 会自动创建检查点。每个检查点都记录操作类型、输入和结果。当您的函数完成一个步骤时，该 SDK 会保留检查点，然后再继续操作。这样可以确保您的函数在发生中断后可以从任何已完成的操作中恢复。

**重放协调：**当您的函数在暂停或中断后恢复时，该 SDK 会执行重放操作。它会从头开始运行您的代码，但会跳过已完成的操作，使用存储的检查点结果而不是重新执行它们。该 SDK 可确保重放具有确定性。如果输入和检查点日志相同，您的函数会生成相同的结果。

**状态隔离：**该 SDK 将执行状态与您的业务逻辑分开维护。每个持久执行都有自己的检查点日志，其他执行无法访问该日志。该 SDK 对静态检查点数据进行加密，并确保重放期间的状态保持一致。

有关检查点操作的工作原理和重放行为的详细说明，请参阅《AWS 耐用执行 SDK 开发人员指南》中的[关键概念](https://docs.aws.amazon.com/durable-execution/getting-started/key-concepts/)。

## 持久操作
<a name="durable-sdk-operations"></a>

该 SDK 为您的函数提供了一个 `DurableContext` 对象。此上下文取代了标准的 Lambda 上下文，并提供了创建检查点、管理执行流以及与外部系统进行协调的方法。

`DurableContext` 为构建耐用工作流程提供了以下操作：


| 操作 | 说明 | 
| --- | --- | 
| [步骤](https://docs.aws.amazon.com/durable-execution/sdk-reference/operations/step/) | 使用可配置的重试策略和执行语义，执行并检查工作单元。 | 
| [Wait](https://docs.aws.amazon.com/durable-execution/sdk-reference/operations/wait/) | 在指定的持续时间内暂停执行，且不使用计算资源。 | 
| [等待条件](https://docs.aws.amazon.com/durable-execution/sdk-reference/operations/wait-for-condition/) | 在两次尝试之间使用自动检查点机制对条件进行轮询。 | 
| [回调](https://docs.aws.amazon.com/durable-execution/sdk-reference/operations/callback/) | 暂停执行并等待外部系统通过 Lambda API 提供输入。 | 
| [Invoke](https://docs.aws.amazon.com/durable-execution/sdk-reference/operations/invoke/) | 使用自动检查点功能调用另一个 Lambda 函数并等待其结果。 | 
| [Parallel](https://docs.aws.amazon.com/durable-execution/sdk-reference/operations/parallel/) | 使用可配置的完成策略同时执行多个操作。 | 
| [Map](https://docs.aws.amazon.com/durable-execution/sdk-reference/operations/map/) | 使用可选的并发控制同时处理集合中的每个项目。 | 
| [子上下文](https://docs.aws.amazon.com/durable-execution/sdk-reference/operations/child-context/) | 为分组多个操作创建隔离的执行上下文。 | 

每次持久操作都会自动创建检查点，从而确保您的函数能够从任何位置恢复运行。有关详细的 API 参考、代码示例和特定语言的用法，请参阅《AWS 耐用执行 SDK 开发人员指南》中的 [SDK 参考](https://docs.aws.amazon.com/durable-execution/sdk-reference/)。

## 如何计量持久操作
<a name="durable-operations-checkpoint-consumption"></a>

您通过 `DurableContext` 调用的每个持久操作都会创建检查点来跟踪执行进度并存储状态数据。这些操作会根据其使用情况产生费用，而这些检查点中可能包含产生您的数据写入和保留成本的数据。存储的数据包括调用事件数据、从步骤中返回的有效载荷以及完成回调时传递的数据。了解持久操作的计量方式有助于您估算执行成本并优化工作流程。有关定价详情，请参阅 [Lambda 定价页面](https://aws.amazon.com/lambda/pricing/)。

有效载荷大小是指持久操作所保存的已序列化数据的大小。数据以字节为单位计量，大小可能会因操作使用的序列化器而异。一次操作的有效载荷可以是操作成功完成后的实际结果，也可以是在操作失败时所生成的序列化错误对象。

### 基本操作
<a name="durable-operations-basic"></a>

基本操作是持久性函数的基本构建块：


| 操作 | 检查点时间 | 操作次数 | 保存的数据 | 
| --- | --- | --- | --- | 
| Execution | 已启动 | 1 | 输入有效载荷大小 | 
| Execution | 已完成（成功/失败/已停止） | 0 | 输出有效载荷大小 | 
| 步骤 | 重试/成功/失败 | 1 \+ N 次重试 | 每次尝试所返回的有效载荷大小 | 
| Wait | 已启动 | 1 | 不适用 | 
| WaitForCondition | 每次轮询尝试 | 1 \+ N 次轮询 | 每次轮询尝试所返回的有效载荷大小 | 
| 调用级重试 | 已启动 | 1 | 错误对象的有效载荷 | 

### 回调操作
<a name="durable-operations-callbacks"></a>

回调操作使您的函数能够暂停并等待外部系统提供输入。这些操作会在创建回调和完成回调时创建检查点：


| 操作 | 检查点时间 | 操作次数 | 保存的数据 | 
| --- | --- | --- | --- | 
| CreateCallback | 已启动 | 1 | 不适用 | 
| 通过 API 调用完成回调 | Completed | 0 | 回调有效载荷 | 
| WaitForCallback | 已启动 | 3 \+ N 次重试（上下文 \+ 回调 \+ 步骤） | 提交步骤尝试所返回的有效载荷，再加上两个回调有效载荷的副本 | 

### 复合操作
<a name="durable-operations-compound"></a>

复合操作将多个持久操作组合在一起，以处理诸如并行执行、数组处理和嵌套上下文等复杂的协调模式：


| 操作 | 检查点时间 | 操作次数 | 保存的数据 | 
| --- | --- | --- | --- | 
| Parallel | 已启动 | 1 \+ N 个分支（1 个父上下文 \+ N 个子上下文） | 每个分支返回的有效载荷大小的最多两份副本，外加每个分支的状态 | 
| Map | 已启动 | 1 \+ N 个分支（1 个父上下文 \+ N 个子上下文） | 每次迭代返回的有效载荷大小的最多两份副本，外加每次迭代的状态 | 
| Promise 助手 | Completed | 1 | Promise 所返回的有效载荷大小 | 
| RunInChildContext | 成功/失败 | 1 | 从子上下文中返回的有效载荷大小 | 

对于上下文，例如来自 `runInChildContext` 或由复合操作在内部使用的上下文，将直接对小于 256KB 的结果进行检查点检查。较大的结果并不会被存储下来——相反，在重放时，它们会通过重新处理上下文的操作而被重新构建。