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

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

Parallel

state ("Type": "Parallel") 可用于在Parallel状态机中添加单独的执行分支。

除了常用状态字段之外,Parallel 状态还包括这些额外字段。

Branches (必需)

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

ResultPath(可选)

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

ResultSelector(可选)

传递键值对集合,其中,键值为静态值或从结果中选择值。有关更多信息,请参阅 ResultSelector

Retry(可选)

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

Catch(可选)

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

Parallel 状态导致 Amazon 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:lambda:us-east-1:123456789012:function:AddressFinder", "End": true } } }, { "StartAt": "LookupPhone", "States": { "LookupPhone": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:PhoneFinder", "End": true } } } ] } } }

在本示例中,LookupAddressLookupPhone 分支并行执行。以下是 Step Functions 控制台中可视化工作流程的外观。


      并行工作流程。

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

并行状态输入和输出处理

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:states:us-east-1:123456789012:activity:Add", "End": true } } }, { "StartAt": "Subtract", "States": { "Subtract": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:Subtract", "End": true } } } ] } } }

如果向 FunWithMath 状态提供了数组 [3, 2] 作为输入,则 AddSubtract 状态均接收该数组作为输入。AddSubtract任务的输出将是数组元素 3 和 2 的总和与差,即51,而Parallel状态的输出将是数组。

[ 5, 1 ]

错误处理

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

注意

当parallel 状态失败时,调用的 Lambda 函数将继续运行,处理任务令牌的活动工作人员不会停止。

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

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