使用 Step Functions 编排 Lambda 函数 - AWS Lambda

使用 Step Functions 编排 Lambda 函数

管理多个任务、实现重试逻辑或包含分支逻辑的 Lambda 函数是反模式。相反,建议编写执行单个任务的 Lambda 函数,并使用 AWS Step Functions 来编排您的应用程序工作流程。

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

何时将 Step Functions 与 Lambda 结合使用

以下场景是何时使用 Step Functions 来编排基于 Lambda 的应用程序的良好示例。

顺序处理

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

单个 Lambda 函数通过以下方式管理整个订单处理工作流程:

  • 按顺序调用其他 Lambda 函数

  • 解析和验证每个函数的响应

  • 实现错误处理和恢复逻辑

  • 管理函数之间的数据流

使用两个 Lambda 函数:一个用于验证订单,另一个用于处理付款。Step Functions 通过以下方式协调这些函数:

  • 按正确的顺序运行任务

  • 在函数之间传递数据

  • 在每个步骤中实现错误处理

  • 使用 Choice 状态确保只有有效的订单才能继续付款

例 工作流程图
Step Functions 工作流程图显示了订单验证、Choice 状态以及包含成功和失败路径的付款处理

复杂的错误处理

虽然 Lambda 为异步调用和事件源映射提供了重试功能,但 Step Functions 为复杂的工作流提供了更复杂的错误处理。您可以使用指数回退配置自动重试,并针对不同类型的错误设置不同的重试策略。重试次数用完后,使用 Catch 将错误路由到回退状态。当您需要协调多个函数和服务的工作流级错误处理时,这特别有用。

要了解有关在状态机中处理 Lambda 函数错误的更多信息,请参阅 The AWS Step Functions Workshop 中的 Handling errors

单个 Lambda 函数可以处理以下所有操作:

  • 尝试调用付款处理服务

  • 如果付款服务不可用,则该函数将等待并稍后重试。

  • 为等待时间实现自定义指数回退

  • 所有尝试都失败后,捕获错误并选择另一个流程

使用仅专注于付款处理的单个 Lambda 函数。Step Functions 通过以下方式管理错误处理:

例 工作流程图
Step Functions 的付款处理工作流程图,包含三种结果:付款成功、付款无效和付款失败

有条件的工作流程和人工批准

使用 Step Functions Choice 状态根据函数输出路由工作流,使用 waitForTaskToken 后缀暂停工作流程以进行人工决策。例如,要处理提高信用额度的请求,请使用 Lambda 函数来评估风险因素。然后,使用 Step Functions 将高风险请求路由到人工批准,将低风险请求路由到自动批准。

要部署使用回调任务令牌集成模式的示例工作流程,请参阅 The AWS Step Functions Workshop 中的 Callback with Task Token

单个 Lambda 函数通过以下方式管理复杂的批准工作流程:

  • 实现嵌套条件逻辑以评估信用申请

  • 根据申请金额调用不同的批准函数

  • 管理多个批准途径和决策点

  • 跟踪待批准的状态

  • 实现批准的超时和通知逻辑

使用三个 Lambda 函数:一个用于评估每个请求的风险,一个用于批准低风险请求,另一个用于将高风险请求路由给经理进行审核。Step Functions 通过以下方式管理工作流程:

  • 使用 Choice 状态根据金额和风险级别路由请求

  • 等待人工批准时暂停执行

  • 管理待批准的超时

  • 提供对每个申请当前状态的可见性

例 工作流程图
Step Functions 工作流程图显示了信用申请评估根据风险分支到自动批准或经理批准

并行处理

Step Functions 提供了三种处理并行处理的方法:

  • Parallel 状态会同时执行工作流程的多个分支。当您需要并行运行不同的函数时(例如在提取图像元数据时生成缩略图),请使用此选项。

  • 内联 Map 状态最多处理 40 次并发迭代的数据数组。此方法适用于需要对每个项目执行相同操作的中小型数据集。

  • 分布式 Map 状态可处理多达 10000 个并发执行的大规模并行处理,同时支持 JSON 数组和 Amazon Simple Storage Service(Amazon S3)数据来源。在处理大型数据集或需要更高并发度时使用此方法。

单个 Lambda 函数尝试通过以下方式管理并行处理:

  • 同时调用多个图像处理函数

  • 实现自定义并行执行逻辑

  • 管理每个并行任务的超时和错误处理

  • 收集和汇总所有函数的结果

使用三个 Lambda 函数:一个用于创建缩略图,一个用于添加水印,一个用于提取元数据。Step Functions 通过以下方式管理这些函数:

  • 使用 Parallel 状态同时运行所有函数

  • 将每个函数的结果收集到一个有序数组中

  • 管理所有并行执行的超时和错误处理

  • 仅在所有并行分支完成后才会继续

例 工作流程图
Step Functions 工作流程图包含三个并行的 Lambda 函数:创建缩略图、添加水印和提取元数据

何时不将 Step Functions 与 Lambda 结合使用

并非所有基于 Lambda 的应用程序都能从使用 Step Functions 中受益。在选择应用程序架构时,请考虑以下场景。

简单的应用程序

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

复杂的数据处理

您可以使用 Step Functions 分布式 Map 状态通过 Lambda 函数同时处理大型 Amazon S3 数据集。这对于许多大规模并行工作负载非常有效,包括处理 JSON 或 CSV 文件等半结构化数据。但是,对于更复杂的数据转换或高级分析,请考虑以下替代方案:

  • 数据转换管道:使用 AWS Glue 执行 ETL 作业,处理来自多个来源的结构化或半结构化数据。当您需要内置数据目录和架构管理功能时,AWS Glue 尤其有用。

  • 数据分析:使用 Amazon EMR 进行 PB 级数据分析,尤其是在您需要 Apache Hadoop 生态系统工具或机器学习工作负载超出 Lambda 的内存限制时。

CPU 密集型工作负载

虽然 Step Functions 可以编排 CPU 密集型任务,但由于 CPU 资源有限,Lambda 函数可能不适合这些工作负载。对于工作流程中的计算密集型操作,请考虑以下替代方案:

  • 容器编排:使用 Step Functions 管理 Amazon Elastic Container Service(Amazon ECS)任务,以获得更一致且可扩展的计算资源。

  • 批处理:将 AWS Batch 与 Step Functions 集成,用于管理需要持续使用 CPU 的计算密集型批处理作业。