并行工作流状态 - AWS Step Functions

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

并行工作流状态

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

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

Branches(必填)

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

ResultPath(可选)

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

ResultSelector(可选)

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

Retry(可选)

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

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: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 工作流程的可视化图表。

每个分支必须是自包含的。对于 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 ]
提示

如果您在状态机中使用的 Parallel 或 Map 状态返回由数组组成的数组,您可以使用 ResultSelector 字段将他们转换为一个平面数组。有关更多信息,请参阅 展平由数组组成的数组

错误处理

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

注意

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

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

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