在 亚马逊云科技 Step Functions 中实现提前退出并行状态的模式

作者: 本杰明·史密斯 |

这篇文章由企业支持高级技术客户经理 Madhav Vishnubhatta 撰写。

这篇博文解释了如何在 亚马逊云科技 Step Fun ction s 中实现模式, 这些模式可在满足最低要求后立即控制 并行状态 的突破。平行状态通常只有在其内部的所有并行流都完成时才会完成。但是,如果您不想等待所有并行流程完成后再进行下一步,则本文提供了帮助实现此功能的模式。

您可以使用 亚马逊云科技 Step Func tions 来设置可视化的无服务器工作流程,将多个 亚马逊云科技 服务编排和协调成一个无服务器工作流程。这使您无需管理底层基础设施即可构建复杂、有状态和可扩展的应用程序。在步进函数中,各个步骤称为状态。

步进函数提供多种 类型的状态 。一些状态有助于控制工作流程的逻辑。例如, 选择状态 使条件逻辑能够根据状态中定义的条件,控制流向多个可能的下一个状态中的任何一个。 并行状态 有助于控制逻辑,但并行状态允许所有分支作为并行流同时运行,而不是选择多个下一个状态中的一个(就像选择状态一样)。当所有并行流完成后,控制将移至并行状态的下一个状态。

无需等待所有并行流完成的模式

考虑一个场景,其中 Step Functions 工作流代表组织中员工申请笔记本电脑的流程。该流程以员工的请求作为第一步,但该请求的批准可能来自两位 IT 经理中的任何一位。

在这种情况下,可能会有两个并行流程,每个流程都在等待一位 IT 经理的批准。但是,只要有人批准,工作流程就可以进入下一步,向员工实际发放笔记本电脑。这是一种 “非此即可” 的模式。

考虑一个类似的用例,但要求略有不同。如果在笔记本电脑发放之前至少需要三分之二的IT经理的批准,那么仅仅一个人的批准就足以发放笔记本电脑,该怎么办。这是 “法定人数” 模式。

并行状态不直接支持这两种模式,因为该状态会等待所有流完成。在这种情况下,这意味着所有经理都必须先提供批准,然后才能发放笔记本电脑。

解决方案概述

Step Functions 提供了一种 具有 失败状态 错误处理机制 ,该机制可用于使工作流程因错误而失败。可以在工作流程的下游发现此错误并根据需要进行处理。使用这种失败状态以及错误处理能力,可以实现非此即彼和法定模式。

如果是非此即可,一旦并行流完成,失败状态就会抛出错误,该错误会在并行状态之外被捕获以进行进一步处理。尽管它处于失败状态,但在你的用例中它可能并不代表错误场景。

法定模式需要额外的机制来使用 Amazon Dynamo DB 表来存储每个并行流的状态。 法定模式在工作流程开始时在 DynamoDB 表中创建一个项目,每个并行流程完成后都会立即更新该项目。每个并行流程都会检查 DynamoDB 表以查看已完成的进程数量,并将其与法定人数进行比较。如果满足法定人数,则该流程会引发错误,其失败状态可能会在并行步骤之外被发现。

先决条件

这两种模式都在 Serverless Land 上发布:

  • https://serverlessland.com/workflows/either-or-parallel-pattern
  • https://serverlessland.com/workflows/quorum-with-parallel-pattern

要部署和使用这些模式,您需要:

  1. 一个 亚马逊云科技 账户
  2. 有权以用户身份登录或担任可以:
    • 创建和运行 Step Functions 工作流程的角色。
    • 创建和更新 DynamoDB 表。
    • 创建一个 亚马逊云科技 身份和访问管理 (IAM) A cces s Management 角色,让步骤函数在运行工作流程时扮演。
  3. 熟悉 亚马逊云科技 无服务器应用程序模型 (亚马逊云科技 SAM )。
  4. 亚马逊云科技 SAM 命令行界面 已安装。

示例演练

非此即彼的模式

要部署 二选一 模式,请按照 GitH ub 存储库中的 部署说明 部分进行操作 此部署创建了以下资源:

  1. 步骤函数工作流程。
  2. 在执行期间由 Step Functions 工作流程承担的 IAM 角色。

导航到 亚马逊云科技 管理控制台中的 亚马逊云科技 CloudFormation 页面,然后使用部署期间提供的名称选择堆栈。在 CloudFormation 堆栈的 资源 部分选择状态机资源以转到步骤函数控制台。选择 “ 编辑” ,然后选择 WorkflowStudio 以直观的方式显示工作流程。

你可以在 GitHub 存储库 中看到导出的工作流程。这是工作流程的逻辑:

非此即彼的模式。概念流程。

  1. 此工作流程中有三个(编号的)并行流。
  2. 流 #1 和 #2 是主要的并行流,其中一个流的完成应该会将控件移到并行状态之外。
  3. Flow #3 是超时流程,因此如果其他两个并行流程都没有完成,则工作流可以在设定的时间后退出。
  4. 两个主要的并行流都遵循以下逻辑:
    • 等待过程完成。这是一个填充物,可以用你关于如何监控流程完成情况的业务逻辑来代替。这可能是人类的认可,也可能是需要完成的任何其他工作。
    • 处理完成后,抛出一个虚拟错误,将控制移至并行状态之外。
  5. 这两个流的虚拟错误是在具有相应捕获条件的并行状态之外捕获的。
  6. 这两个流程中的错误不必分开捕获。无论哪个并行流已经完成,你都可能只做同样的操作,但我将单独显示一些步骤,以防你需要根据平行流的完成情况做一些不同的操作。

要测试工作流程,请按照 GitHub 存储库自述文件的 “ 测试” 部分 提供的说明进行操作。

要清理创建的资源,请运行:

sam delete

法定人数模式

要部署法定模式,请按照 GitH ub 存储库中的 部署说明 部分进行操作 。 此部署创建了以下资源:

  1. 步骤函数工作流程。
  2. 在执行期间由 Step Functions 工作流程承担的 IAM 角色。
  3. 一个名为 “quorumWorkFlowtable” 的 DynamoDB 表。

在 亚马逊云科技 管理控制台中导航到 CloudFormation,然后使用部署期间提供的名称选择堆栈。在 CloudFormation 堆栈的 资源 部分选择状态机资源以转到步骤函数控制台。

选择 “ 编辑” ,然后选择 WorkflowStudio 以直观的方式显示工作流程。

你可以在 GitHub 存储库 中看到导出的工作流程。这是工作流程的逻辑:

法定人数模式。概念流程。

  1. 第一步在 DynamoDB 表中创建一个条目,其中包含工作流程执行的执行 ID。表中的此项目跟踪流程的完成情况。
  2. 下一个状态是并行状态,它有三个并行流和第四个超时流。所有四个流量都有编号。
  3. 流程 #1、#2 和 #3 是主要的并行流,其中两个流的完成会将控件移至并行状态之外。
  4. Flow #4 是超时流程,因此如果其他两个并行流程都没有完成,则工作流可以在设定的时间后退出。
  5. 三个主要的并行流都使用以下逻辑:
    • 等待过程完成。
    • 完成后,更新 DynamoDB 表条目以标记该过程已完成。
    • 更新后,从 DynamoDB 查询项目以获取已完成的流程列表,并检查是否已达到法定人数。
    • 如果已达到法定人数,则提出 “错误”(这实际上是商业案例的成功标准),将控制权移至平行状态之外。

要测试工作流程,请按照 GitHub 存储库自述文件的 “ 测试” 部分 提供的说明进行操作。

要清理创建的资源,请运行:

sam delete

结论

这篇博文介绍如何在 亚马逊云科技 Step Functions 工作流程中实现必须尽早退出并行状态的模式。

这种方法的用例不仅限于这两种模式。更复杂的用例,例如使用不同的条件组合来退出并行状态,都可以使用并行和失败状态来实现。

访问 Serverless Land 了解更多步骤函数工作流程模式。阅读指南: 无服务器数据处理分布式地图 简介,了解步进函数中的数据处理


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。