

# 使用 Step Functions 编排 Lambda 函数
<a name="with-step-functions"></a>

Amazon Step Functions 提供可视化工作流编排，用于协调 Lambda 函数与其他 Amazon 服务。Step Functions 与 220 多种 Amazon 服务本机集成，并提供完全托管、零维护基础设施，是您需要可视化工作流设计和完全托管的服务集成时的理想选择。

要在 Lambda 中使用标准编程语言进行编排（其中工作流逻辑与业务逻辑并存），请考虑 [Lambda 持久性函数](durable-functions.md)。有关在这些选项之间进行选择的帮助，请参阅[持久性函数或 Step Functions](durable-step-functions.md)。

例如，处理订单可能需要验证订单详细信息、检查库存水平、处理付款和生成发票。为每项任务编写单独的 Lambda 函数，然后使用 Step Functions 来管理工作流程。Step Functions 协调函数之间的数据流，并处理每个步骤中的错误。随着工作流程变得越来越复杂，这种分离使您的工作流程更易于可视化、修改和维护。

## 何时将 Step Functions 与 Lambda 结合使用
<a name="when-to-use-step-functions"></a>

以下场景很好地说明了 Step Functions 何时特别适合编排基于 Lambda 的应用程序。
+ [顺序处理](#sequential-processing)
+ [复杂的错误处理](#complex-error-handling)
+ [有条件的工作流程和人工批准](#conditional-workflows-human-approvals)
+ [并行处理](#parallel-processing)

### 顺序处理
<a name="sequential-processing"></a>

顺序处理是指必须先完成一项任务才能开始下一个任务。例如，在订单处理系统中，只有在订单验证完成后才能开始付款处理，并且必须等待付款确认后才能生成发票。为每项任务编写单独的 Lambda 函数，然后使用 Step Functions 来管理序列和处理函数之间的数据流。

#### 反模式示例
<a name="anti-pattern-sequential"></a>

单个 Lambda 函数通过以下方式管理整个订单处理工作流程：
+ 按顺序调用其他 Lambda 函数
+ 解析和验证每个函数的响应
+ 实现错误处理和恢复逻辑
+ 管理函数之间的数据流

#### 推荐方法
<a name="recommended-sequential"></a>

使用两个 Lambda 函数：一个用于验证订单，另一个用于处理付款。Step Functions 通过以下方式协调这些函数：
+ 按正确的顺序运行任务
+ 在函数之间传递数据
+ 在每个步骤中实现错误处理
+ 使用 [Choice](https://docs.amazonaws.cn/step-functions/latest/dg/state-choice.html) 状态确保只有有效的订单才能继续付款

**Example 工作流程图**  

![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/sequential_workflow.png)


**注意**  
**代码优先替代方案：**有关使用基于代码的检查点进行顺序处理和重试，请参阅 [Lambda 持久性函数步骤](durable-basic-concepts.md)。

### 复杂的错误处理
<a name="complex-error-handling"></a>

虽然 Lambda 为[异步调用和事件源映射提供了重试功能](invocation-retries.md)，但 Step Functions 为复杂的工作流提供了更复杂的错误处理。您可以使用指数回退[配置自动重试](https://docs.amazonaws.cn/step-functions/latest/dg/concepts-error-handling.html#error-handling-retrying-after-an-error)，并针对不同类型的错误设置不同的重试策略。重试次数用完后，使用 `Catch` 将错误路由到[回退状态](https://docs.amazonaws.cn/step-functions/latest/dg/concepts-error-handling.html#error-handling-fallback-states)。当您需要协调多个函数和服务的工作流级错误处理时，这特别有用。

要了解有关在状态机中处理 Lambda 函数错误的更多信息，请参阅 *The Amazon Step Functions Workshop* 中的 [Handling errors](https://catalog.workshops.aws/stepfunctions/handling-errors)。

#### 反模式示例
<a name="anti-pattern-error-handling"></a>

单个 Lambda 函数可以处理以下所有操作：
+ 尝试调用付款处理服务
+ 如果付款服务不可用，则该函数将等待并稍后重试。
+ 为等待时间实现自定义指数回退
+ 所有尝试都失败后，捕获错误并选择另一个流程

#### 推荐方法
<a name="recommended-error-handling"></a>

使用仅专注于付款处理的单个 Lambda 函数。Step Functions 通过以下方式管理错误处理：
+ [使用可配置的回退周期自动重试失败的任务](https://docs.amazonaws.cn/step-functions/latest/dg/concepts-error-handling.html#error-handling-retrying-after-an-error)
+ 根据错误类型应用不同的重试策略
+ 将不同类型的错误路由到相应的回退状态
+ 维护错误处理状态和历史记录

**Example 工作流程图**  

![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/error_handling_workflow.png)


**注意**  
**代码优先替代方案：**持久性函数通过可配置的重试策略提供 try-catch 错误处理。请参阅[持久性函数中的错误处理](durable-execution-sdk-retries.md)。

### 有条件的工作流程和人工批准
<a name="conditional-workflows-human-approvals"></a>

使用 Step Functions [Choice 状态](https://docs.amazonaws.cn/step-functions/latest/dg/state-choice.html)根据函数输出路由工作流，使用 [waitForTaskToken 后缀](https://docs.amazonaws.cn/step-functions/latest/dg/connect-to-resource.html#connect-wait-token)暂停工作流程以进行人工决策。例如，要处理提高信用额度的请求，请使用 Lambda 函数来评估风险因素。然后，使用 Step Functions 将高风险请求路由到人工批准，将低风险请求路由到自动批准。

要部署使用回调任务令牌集成模式的示例工作流程，请参阅 *The Amazon Step Functions Workshop* 中的 [Callback with Task Token](https://catalog.workshops.aws/stepfunctions/integrating-services/3-callback-token)。

#### 反模式示例
<a name="anti-pattern-conditional"></a>

单个 Lambda 函数通过以下方式管理复杂的批准工作流程：
+ 实现嵌套条件逻辑以评估信用申请
+ 根据申请金额调用不同的批准函数
+ 管理多个批准途径和决策点
+ 跟踪待批准的状态
+ 实现批准的超时和通知逻辑

#### 推荐方法
<a name="recommended-conditional"></a>

使用三个 Lambda 函数：一个用于评估每个请求的风险，一个用于批准低风险请求，另一个用于将高风险请求路由给经理进行审核。Step Functions 通过以下方式管理工作流程：
+ 使用 [Choice](https://docs.amazonaws.cn/step-functions/latest/dg/state-choice.html) 状态根据金额和风险级别路由请求
+ 等待人工批准时暂停执行
+ 管理待批准的超时
+ 提供对每个申请当前状态的可见性

**Example 工作流程图**  

![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/conditional_workflow.png)


**注意**  
**代码优先替代方案：**持久性函数支持人工介入工作流的回调。请参阅[持久性函数中的回调](durable-execution-sdk.md)。

### 并行处理
<a name="parallel-processing"></a>

Step Functions 提供了三种处理并行处理的方法：
+ [Parallel 状态](https://docs.amazonaws.cn/step-functions/latest/dg/state-parallel.html)会同时执行工作流程的多个分支。当您需要并行运行不同的函数时（例如在提取图像元数据时生成缩略图），请使用此选项。
+ [内联 Map 状态](https://docs.amazonaws.cn/step-functions/latest/dg/state-map-inline.html)最多处理 40 次并发迭代的数据数组。此方法适用于需要对每个项目执行相同操作的中小型数据集。
+ [分布式 Map 状态](https://docs.amazonaws.cn/step-functions/latest/dg/state-map-distributed.html)可处理多达 10000 个并发执行的大规模并行处理，同时支持 JSON 数组和 Amazon Simple Storage Service（Amazon S3）数据来源。在处理大型数据集或需要更高并发度时使用此方法。

#### 反模式示例
<a name="anti-pattern-parallel"></a>

单个 Lambda 函数尝试通过以下方式管理并行处理：
+ 同时调用多个图像处理函数
+ 实现自定义并行执行逻辑
+ 管理每个并行任务的超时和错误处理
+ 收集和汇总所有函数的结果

#### 推荐方法
<a name="recommended-parallel"></a>

使用三个 Lambda 函数：一个用于创建缩略图，一个用于添加水印，一个用于提取元数据。Step Functions 通过以下方式管理这些函数：
+ 使用 [Parallel](https://docs.amazonaws.cn/step-functions/latest/dg/state-parallel.html) 状态同时运行所有函数
+ 将每个函数的结果收集到一个有序数组中
+ 管理所有并行执行的超时和错误处理
+ 仅在所有并行分支完成后才会继续

**Example 工作流程图**  

![\[\]](http://docs.amazonaws.cn/lambda/latest/dg/images/parallel_workflow.png)


**注意**  
**代码优先替代方案：**持久性函数提供 `parallel()` 和 `map()` 操作。请参阅[并行执行](durable-execution-sdk.md)。

## 何时不将 Step Functions 与 Lambda 结合使用
<a name="when-not-to-use"></a>

并非所有基于 Lambda 的应用程序都能从使用 Step Functions 中受益。在选择应用程序架构时，请考虑以下场景。
+ [简单的应用程序](#simple-applications)
+ [复杂的数据处理](#complex-data-processing)
+ [CPU 密集型工作负载](#cpu-intensive)

### 简单的应用程序
<a name="simple-applications"></a>

**注意**  
对于不需要视觉对象设计或大量服务集成的工作流，[Lambda 持久性函数](durable-functions.md)可能是一种更简单的替代方案，其可将工作流逻辑保留在 Lambda 中的代码中。

对于不需要复杂编排的应用程序，使用 Step Functions 可能会增加不必要的复杂性。例如，如果您只是处理 Amazon SQS 队列的消息或响应 Amazon EventBridge 事件，则可以将这些服务配置为直接调用您的 Lambda 函数。同样，如果您的应用程序仅包含一两个 Lambda 函数，且错误处理简单明了，则直接 Lambda 调用或事件驱动的架构可能更易于部署和维护。

### 复杂的数据处理
<a name="complex-data-processing"></a>

您可以使用 Step Functions [分布式 Map](https://docs.amazonaws.cn/step-functions/latest/dg/state-map-distributed.html) 状态通过 Lambda 函数同时处理大型 Amazon S3 数据集。这对于许多大规模并行工作负载非常有效，包括处理 JSON 或 CSV 文件等半结构化数据。但是，对于更复杂的数据转换或高级分析，请考虑以下替代方案：
+ **数据转换管道**：使用 Amazon Glue 执行 ETL 作业，处理来自多个来源的结构化或半结构化数据。当您需要内置数据目录和架构管理功能时，Amazon Glue 尤其有用。
+ **数据分析：**使用 Amazon EMR 进行 PB 级数据分析，尤其是在您需要 Apache Hadoop 生态系统工具或机器学习工作负载超出 Lambda 的[内存](configuration-memory.md)限制时。

### CPU 密集型工作负载
<a name="cpu-intensive"></a>

虽然 Step Functions 可以编排 CPU 密集型任务，但由于 CPU 资源有限，Lambda 函数可能不适合这些工作负载。对于工作流程中的计算密集型操作，请考虑以下替代方案：
+ **容器编排：**使用 Step Functions 管理 Amazon Elastic Container Service（Amazon ECS）任务，以获得更一致且可扩展的计算资源。
+ **批处理：**将 Amazon Batch 与 Step Functions 集成，用于管理需要持续使用 CPU 的计算密集型批处理作业。