本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Step Functions 中了解状态机
Step Functions 基于状态机和任务。在 Step Functions 中,状态机被称为工作流,这是一系列事件驱动的步骤。工作流程中的每个步骤都称为状态。例如,任务状态代表另一个工作单元 AWS 服务执行,例如呼叫另一个 AWS 服务 或API。在 Step Functions 中,运行工作流程执行任务的实例称为执行。
重要概念
以下内容概述了 Step Functions 的关键上下文术语。
租期 | 描述 |
---|---|
工作流 | 通常反映业务流程的一系列步骤。 |
状态 |
状态机中的各个步骤可以根据其输入做出决策,根据这些输入执行操作,并将输出传递给其他状态。 有关更多信息,请参阅 发现要在 Step Functions 中使用的工作流程状态。 |
Workflow Studio |
一款可视化工作流设计器,可帮助您更快地进行工作流的原型设计和构建。 有关更多信息,请参阅 在 Step Functions 工作流工作室中开发工作流程。 |
状态机 | 使用表示工作流中各个状态或步骤的JSON文本以及字段(例如 有关更多信息,请参阅 用于 Step Functions 工作流程的 Amazon States 语言中的状态机结构。 |
Amazon States Language |
一种JSON基于结构化的语言,用于定义状态机。使用ASL,您可以定义一组可以起作用的Task状态(状态),确定哪些状态要过渡到下一个Choice状态(状态),并通过错误停止执行(Fail状态)。 有关更多信息,请参阅 使用 Amazon States 语言定义 Step Functions 工作流程。 |
输入与输出配置 |
工作流中的状态接收JSON数据作为输入,通常会将JSON数据作为输出传递到下一个状态。Step Functions 提供过滤器来控制各州之间的数据流。 有关更多信息,请参阅 在 Step Functions 中处理输入和输出。 |
服务集成 |
你可以打电话 AWS 工作流程中的服务API操作。 有关更多信息,请参阅 将服务与 Step Functions 集成。 |
服务集成类型 | |
服务集成模式 | 打电话时 AWS 服务,则使用以下服务集成模式之一:
|
Execution |
状态机执行是指运行工作流执行任务的实例。 有关更多信息,请参阅 在 Step Functions 中启动状态机执行。 |
状态机数据
状态机数据采用以下形式:
-
状态机的初始输入
-
在状态之间传递的数据
-
状态机的输出
本节介绍状态机数据的格式和使用方式 AWS Step Functions.
数据格式
状态机数据用JSON文本表示。您可以使用支持的任何数据类型向状态机提供值JSON。
注意
-
JSON文本格式的数字符合 JavaScript 语义。这些数字通常对应于双精度 IEEE-854 值
。 -
以下是有效的JSON文本:
-
以引号分隔的独立字符串
-
对象
-
数组
-
数字
-
布尔值
-
null
-
-
一个状态的输出成为下一个状态的输入。但是,您可以使用输入和输出处理,将状态限制为处理输入数据的子集。
状态机输入/输出
您可以将初始输入数据提供给 AWS 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
状态,则由执行中的输入组成。某些流控制状态的输出与输入相同。
在以下示例中,状态机将两个数字加到一起。
-
定义 AWS 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 }); }
-
定义状态机。
{ "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 } } }
-
使用以下JSON文本开始执行。
{ "numbers": [3, 4] }
Add
状态接收JSON文本并将其传递给 Lambda 函数。Lambda 函数将计算结果返回给状态。
状态在其输出中返回以下值。
{ "result": 7 }
由于
Add
还是状态机中的最后一个状态,此值作为状态机的输出返回。如果最后一个状态未返回输出,则状态机返回空对象 (
{}
)。
有关更多信息,请参阅 在 Step Functions 中处理输入和输出。
调用 AWS Step Functions 来自其他服务
您可以配置其他几个服务来调用状态机。根据状态机的工作流类型,您可以异步或同步调用状态机。要同步调用状态机,StartSyncExecution
API请使用调用或 Amazon API Gateway 与 Express Workflows 集成。使用异步调用时,Step Functions 会暂停工作流执行,直到返回任务令牌。但是,等待任务令牌会使工作流同步。
您可以配置为调用 Step Functions 的服务包括:
-
AWS Lambda,使用呼
StartExecution
叫。
Step Functions 调用受 StartExecution
配额的约束。有关更多信息,请参阅:
状态机中的过渡
在启动状态机的新执行时,系统以在顶级 StartAt
字段中引用的状态开始。此字段为字符串形式,必须完全匹配工作流中某个状态的名称,并且区分大小写。
状态运行后, AWS 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 状态。
分布式 Map 状态下的转换
当您在分布式模式下使用 Map
状态时,对于分布式 Map 状态 启动的每个子工作流执行,都会收取一次状态转换的费用。当您在内联模式下使用 Map
状态时,您无需为内联 Map 状态 的每次迭代支付状态转换费用。
您可以在分布式模式下使用 Map
状态,并在 Map
状态定义中包含嵌套工作流,进而优化成本。当您启动快速类型的子工作流执行时,分布式 Map 状态还会增加更多价值。Step Functions 存储 Express 子工作流程执行的响应和状态,从而减少了在 CloudWatch 日志中存储执行数据的需求。您还可以访问分布式 Map 状态 下的可用流量控制,例如定义错误阈值或批处理一组项目。有关 Step Functions 定价的信息,请参阅 AWS Step Functions 定价
Step Functions 中的读取一致性
状态机更新中 AWS Step Functions 最终是一致的。几秒钟内的所有StartExecution
调用都将使用更新的定义和roleArn
(IAM角色的 Amazon 资源名称)。但在调用 UpdateStateMachine
后立即启动的执行可能会使用以前的状态机定义和 roleArn
。
有关更多信息,请参阅下列内容:
-
中的
UpdateStateMachine
AWS Step Functions API参考