AWS Step Functions
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Parallel

Parallel 状态 ("Type": "Parallel") 可用于在状态机中创建并行执行分支。

除了常用状态字段之外,Parallel 状态引入了这些额外字段。

Branches (必需)

一个对象数组,指定要并行执行的状态机。每个此类状态机对象都必须具有名为 StatesStartAt 的字段,其含义与在状态机顶级中的字段完全相同。

ResultPath(可选)

指定 (输入中) 用于放置分支输出的位置。接下来,输入将按照 OutputPath 字段(如果存在)指定的内容进行筛选,然后再用作状态输出。有关更多信息,请参阅输入和输出处理

Retry(可选)

一个称为重试器的对象的数组,定义在状态遇到运行时错误的情况下的重试策略。有关更多信息,请参阅出错后重试

Catch(可选)

一个称为捕获器的对象的数组,定义在状态遇到运行时错误并且其重试策略已耗尽或者未定义的情况下执行的回退状态。有关更多信息,请参阅回退状态

Parallel 状态导致 AWS Step Functions 执行每个分支,从该分支的 StartAt 字段中指定的状态开始,在可能时并发运行,并一直等到所有分支终止(进入最终状态),然后处理 Parallel 状态的 Next 字段。

以下是示例。

{ "Comment": "Parallel Example.", "StartAt": "LookupCustomerInfo", "States": { "LookupCustomerInfo": { "Type": "Parallel", "End": true, "Branches": [ { "StartAt": "LookupAddress", "States": { "LookupAddress": { "Type": "Task", "Resource": "arn:aws-cn:lambda:us-east-1:123456789012:function:AddressFinder", "End": true } } }, { "StartAt": "LookupPhone", "States": { "LookupPhone": { "Type": "Task", "Resource": "arn:aws-cn:lambda:us-east-1:123456789012:function:PhoneFinder", "End": true } } } ] } } }

在本示例中,LookupAddressLookupPhone 分支并行执行。以下是可视工作流在 Step Functions 控制台中的显示效果。


      并行工作流程。

每个分支必须是自包含的。对于 Parallel 状态的一个分支中的状态,不能具有将该分支之外的字段作为目标的 Next 字段,该分支之外的任何其他状态也不能转换到该分支中。

Parallel 状态输出

Parallel 状态向每个分支提供其自己输入数据的副本 (需要由 InputPath 字段修改)。它会生成一个数组输出,在该数组中每个分支有一个元素,包含来自该分支的输出。不要求所有元素具有相同类型。输出数组可以按照常规方法,使用 ResultPath 字段插入到输入数据 (并且整体作为 Parallel 状态的输出发送) (请参阅输入和输出处理)。

以下是另一个示例。

{ "Comment": "Parallel Example.", "StartAt": "FunWithMath", "States": { "FunWithMath": { "Type": "Parallel", "End": true, "Branches": [ { "StartAt": "Add", "States": { "Add": { "Type": "Task", "Resource": "arn:aws-cn:swf:us-east-1:123456789012:task:Add", "End": true } } }, { "StartAt": "Subtract", "States": { "Subtract": { "Type": "Task", "Resource": "arn:aws-cn:swf:us-east-1:123456789012:task:Subtract", "End": true } } } ] } } }

如果向 FunWithMath 状态提供了数组 [3, 2] 作为输入,则 AddSubtract 状态均接收该数组作为输入。Add 的输出将为 5Subtract 的输出将为 1,而 Parallel 状态的输出将为数组。

[ 5, 1 ]

错误处理

如果任何分支由于未处理的错误或者转换为 Fail 状态而失败,则整个 Parallel 状态将视为已失败,并且会停止所有其分支。如果 Parallel 状态本身不处理错误,Step Functions 将停止执行,并出现错误。

注意

当 Parallel 状态失败后,调用的 Lambda 函数将继续运行并且处理任务令牌的活动工作线程不会停止。

  • 要停止长时间运行的活动,请使用检测信号检测 Step Functions 是否已停止其分支并停止正在处理任务的工作线程。如果状态已失败,则调用 SendTaskHeartbeatSendTaskSuccessSendTaskFailure 将引发错误。请参阅检测信号错误

  • 运行中的 Lambda 函数无法停止。如果您已实施回退,请使用 Wait 状态,以便清理工作在 Lambda 函数完成后出现。

本页内容: