在 Step Functions 中了解状态机 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Step Functions 中了解状态机

Step Functions 基于状态机和任务。在 Step Functions 中,状态机被称为工作流,这是一系列事件驱动的步骤。工作流程中的每个步骤都称为状态。例如,任务状态代表另一个工作单元 Amazon 服务执行,例如呼叫另一个 Amazon Web Services 服务 或API。在 Step Functions 中,运行工作流程执行任务的实例称为执行

Step Functions 工作流程图的说明性示例。

重要概念

以下内容概述了 Step Functions 的关键上下文术语。

租期 描述
工作流 通常反映业务流程的一系列步骤。
状态

状态机中的各个步骤可以根据其输入做出决策,根据这些输入执行操作,并将输出传递给其他状态。

有关更多信息,请参阅 发现要在 Step Functions 中使用的工作流程状态

Workflow Studio

一款可视化工作流设计器,可帮助您更快地进行工作流的原型设计和构建。

有关更多信息,请参阅 在 Step Functions 工作流工作室中开发工作流程

状态机

使用表示工作流中各个状态或步骤的JSON文本以及字段(例如StartAtTimeoutSeconds、和)定义的工作流Version

有关更多信息,请参阅 用于 Step Functions 工作流程的 Amazon States 语言中的状态机结构

Amazon States Language

一种JSON基于结构化的语言,用于定义状态机。使用ASL,您可以定义一组可以起作用的Task状态(状态),确定哪些状态要过渡到下一个Choice状态(状态),并通过错误停止执行(Fail状态)。

有关更多信息,请参阅 使用 Amazon States 语言定义 Step Functions 工作流程

输入与输出配置

工作流中的状态接收JSON数据作为输入,通常会将JSON数据作为输出传递到下一个状态。Step Functions 提供过滤器来控制各州之间的数据流。

有关更多信息,请参阅 在 Step Functions 中处理输入和输出

服务集成

你可以打电话 Amazon 工作流程中的服务API操作。

有关更多信息,请参阅 将服务与 Step Functions 集成

服务集成类型
  • Amazon SDK集成 — 拨打两百多个中的任何一个的标准方式 Amazon Web Services 服务 还有九千多个API操作直接来自你的状态机。

  • 优化的集成 — 自定义集成,可简化与某些服务的呼叫和数据交换。例如,Lambda Invok e 会自动将响应Payload字段从转义JSON字符串转换为对象。JSON

服务集成模式

打电话时 Amazon Web Services 服务,则使用以下服务集成模式之一:

Execution

状态机执行是指运行工作流执行任务的实例。

有关更多信息,请参阅 在 Step Functions 中启动状态机执行

状态机数据

状态机数据采用以下形式:

  • 状态机的初始输入

  • 在状态之间传递的数据

  • 状态机的输出

本节介绍状态机数据的格式和使用方式 Amazon Step Functions.

数据格式

状态机数据用JSON文本表示。您可以使用支持的任何数据类型向状态机提供值JSON。

注意
  • JSON文本格式的数字符合 JavaScript 语义。这些数字通常对应于双精度 IEEE-854 值

  • 以下是有效的JSON文本:

    • 以引号分隔的独立字符串

    • 对象

    • 数组

    • 数字

    • 布尔值

    • null

  • 一个状态的输出成为下一个状态的输入。但是,您可以使用输入和输出处理,将状态限制为处理输入数据的子集。

状态机输入/输出

您可以将初始输入数据提供给 Amazon Step Functions 状态机有两种方式。开始执行时,可以将数据传递给一个 StartExecution 操作。您也可以从 Step Functions 控制台将数据传递到状态机。初始数据传递到状态机的 StartAt 状态。如果未提供输入,默认值为空对象 ({})。

执行的输出由最后一个状态 (terminal) 返回。此输出以JSON文本形式出现在执行结果中。

对于标准工作流,您可以使用外部调用方(例如,在 DescribeExecution 操作中),从执行历史记录中检索执行结果。您可以在 Step Functions 控制台上查看执行结果。

对于 Express Workflows,如果您启用了日志记录,则可以从 CloudWatch 日志中检索结果,或者在 Step Functions 控制台中查看和调试执行。有关更多信息,请参阅在 Step Functions 中使用 CloudWatch 日志记录执行历史记录在 Step Functions 控制台中查看执行详情

您还应该考虑与状态机相关的配额。有关更多信息,请参阅 Step Functions 服务配额

状态输入/输出

每个状态的输入都由来自前一个状态的JSON文本组成,或者对于该StartAt状态,则由执行中的输入组成。某些流控制状态的输出与输入相同。

在以下示例中,状态机将两个数字加到一起。

  1. 定义 Amazon Lambda function。

    function Add(input) { var numbers = JSON.parse(input).numbers; var total = numbers.reduce( function(previousValue, currentValue, index, array) { return previousValue + currentValue; }); return JSON.stringify({ result: total }); }
  2. 定义状态机。

    { "Comment": "An example that adds two numbers together.", "StartAt": "Add", "Version": "1.0", "TimeoutSeconds": 10, "States": { "Add": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Add", "End": true } } }
  3. 使用以下JSON文本开始执行。

    { "numbers": [3, 4] }

    Add状态接收JSON文本并将其传递给 Lambda 函数。

    Lambda 函数将计算结果返回给状态。

    状态在其输出中返回以下值。

    { "result": 7 }

    由于 Add 还是状态机中的最后一个状态,此值作为状态机的输出返回。

    如果最后一个状态未返回输出,则状态机返回空对象 ({})。

有关更多信息,请参阅 在 Step Functions 中处理输入和输出

调用 Amazon Step Functions 来自其他服务

您可以配置其他几个服务来调用状态机。根据状态机的工作流类型,您可以异步或同步调用状态机。要同步调用状态机,StartSyncExecutionAPI请使用调用或 Amazon API Gateway 与 Express Workflows 集成。使用异步调用时,Step Functions 会暂停工作流执行,直到返回任务令牌。但是,等待任务令牌会使工作流同步。

您可以配置为调用 Step Functions 的服务包括:

Step Functions 调用受 StartExecution 配额的约束。有关更多信息,请参阅:

状态机中的过渡

在启动状态机的新执行时,系统以在顶级 StartAt 字段中引用的状态开始。此字段为字符串形式,必须完全匹配工作流中某个状态的名称,并且区分大小写。

状态运行后, Amazon Step Functions 使用该Next字段的值来确定要进入的下一个状态。

Next 字段还将状态名称指定为字符串。此字符串区分大小写,并且必须完全匹配状态机定义中指定的状态名称。

例如,以下状态包括到 NextState 的转换。

"SomeState" : { ..., "Next" : "NextState" }

大部分状态只允许使用具有 Next 字段的一个转换规则。不过,某些流控制状态(例如,Choice 状态)允许您指定多个转换规则,每个具有各自的 Next 字段。Amazon States Language 提供有关您可指定的各个状态类型的详细信息,包括如何指定转换的信息。

状态可以有多个来自其他状态的传入转换。

该过程重复,直至到达最终状态 ("Type": Succeed"Type": Fail"End": true 状态) 或者出现运行时错误。

当您 时redrive一次执行,它被视为状态转换。此外,所有在 a 中重新运行的状态 redrive 也被视为状态转换。

以下规则适用于状态机中的状态:

  • 状态在封闭块中可以按任意顺序出现。但是,它们列出的顺序不会影响到它们的运行顺序。运行顺序由状态的内容决定。

  • 在状态机中,只能有一个状态指定为 start 状态。start 状态由顶级结构中 StartAt 字段的值定义。

  • 根据您的状态机逻辑,您可能会有多个 end 状态 (例如状态机有多个逻辑分支时)。

  • 如果状态机只包含一个状态,该状态可以为 start 状态和 end 状态。

Step Functions 中的读取一致性

状态机更新中 Amazon Step Functions 最终是一致的。几秒钟内的所有StartExecution调用都将使用更新的定义和roleArn(IAM角色的 Amazon 资源名称)。但在调用 UpdateStateMachine 后立即启动的执行可能会使用以前的状态机定义和 roleArn

有关更多信息,请参阅下列内容: