集成Serverless 工作流功能让您可以方便地在一个流程中执行另一个流程,本文介绍了集成Serverless 工作流的使用场景、集成模式、对象说明和子流程的输入输出规则。
使用场景
在以下场景中可以考虑使用Serverless 工作流集成:
- 降低流程的复杂度,将一个流程分解为多个流程。
- 让流程更容易被复用。您可以将通用的一些步骤放在一个流程中,被其他多个流程复用。
- 突破当前单流程的某些限制,例如当前单个流程最多event个数限制(默认5000)和最长执行时间限制(最长1年)。
- 对流程中的一些控制步骤做错误处理。例如可以将并行步骤做成子流程,在主流程中对子流程执行错误做错误处理。
集成模式
Serverless 工作流集成支持三种模式,分别是请求响应(requestResponse)模式、同步(sync)模式和等待回调(waitForCallback)模式。
- 请求响应(requestResponse)模式该模式下,主流程将在启动子流程成功后立刻开始执行下一步骤。流程定义如下。
version: v1 type: flow steps: - type: task name: fnfInvoke resourceArn: acs:fnf:::flow/subflow_demo_child pattern: requestResponse # 可省略,默认。 inputMappings: # 如无inputMappings,将按默认映射规则将主流程参数作为子流程的Input。 - target: childName # 用于在service中设定发起的子流程的执行名称。 source: $input.childName serviceParams: # 集成Serverless工作流的服务参数,该参数可省略。如省略本参数,我们将使用随机字符串作为本次执行的名称,使用InputMappings对应的参数作为子流程的输入。 Input: $ # 用映射后的input作为启动子流程的输入参数。 ExecutionName: $.childName # 如果在serviceParams中使用变量, 请确保该变量存在于inputMappings中。
- 同步(sync)模式
该模式下,主流程将启动一个子流程并等待子流程执行完成后再进入下一步骤。流程定义如下。
version: v1 type: flow steps: - type: parallel name: parallelTask branches: - steps: # 本步骤展示使用sync模式集成Serverless工作流,使用inputMappings作为子流程的输入,并通过主流程的输入来动态指定子流程的执行名称。 - type: task name: fnfSync resourceArn: acs:fnf:::flow/subflow_demo_child pattern: sync inputMappings: # 如无inputMappings,将按默认映射规则将主流程参数作为子流程的Input。 - target: childSyncName # 发起的子流程的执行名称。如您需指定子流程的执行名称,请按本示例所示对期望的执行名称进行inputMapping,并在serviceParams中使用。 source: $input.childSyncName。 serviceParams: # 集成Serverless工作流的服务参数。 Input: $ # 用映射后的inputMappings作为启动子流程的输入参数. 除非您很明确使用其他方式指定Input时的行为及语法,否则建议您使用我们提供的此种方式。 ExecutionName: $.childSyncName # 如果在serviceParams中使用变量, 请确保该变量存在于inputMappings中。
- 等待回调(waitForCallback)模式
该模式下,主流程将启动一个子流程并进入暂停状态,直到收到回调通知。流程定义如下。
version: v1 type: flow steps: - steps: # 本步骤展示使用waitForCallback模式集成Serverless工作流,使用inputMappings作为子流程的输入,并通过主流程的输入来动态指定子流程的执行名称。 - type: task name: fnfWaitForCallback resourceArn: acs:fnf:::flow/subflow_demo_child pattern: waitForCallback inputMappings: # 如无inputMappings,将按默认映射规则将主流程参数作为子流程的Input。 - target: task_token # 为确保子流程中可以使用回调,请自定义名称对task_token进行显示映射。 source: $context.task.token # 从context对象中获取表示该任务的令牌(task token)。 - target: childCallbackName source: $input.childCallbackName serviceParams: # 集成Serverless工作流的服务参数。 Input: $ # 用映射后的inputMappings作为启动子流程的输入参数。 ExecutionName: $.childCallbackName # 如果在serviceParams中使用变量, 请确保该变量存在于inputMappings中。
上下文对象说明
在子流程集成模式中,您可以将$context.execution.name
及$context.flow.name
变量传递给子流程,用于在子流程中识别启动它的父流程。在waitForCallback
模式下,$context.task.token
将被使用,用来向子流程传递父流程的运行标识符来实现回调。
子流程的输入输出规则
- 请求响应模式
子流程的输入来源于任务的输入,您可以在子流程中通过
$Input
来获取该输入。请求响应模式子流程的启动信息(
StartExecution
API的响应)将会被作为输出,而子流程自身输出将被主流程忽略。在启动子流程后,我们默认提供了$local.ExecutionName
、$local.FlowName
、$local.RequestId
三个子流程启动信息。如果您需要对其进行额外处理,可在主流程对应步骤中使用outputMappings
进行映射。- type: task pattern: requestResponse ... outputMappings: # requestResponse模式可获取参数:$local.ExecutionName, $local.FlowName, $local.RequestId。 - target: subflow_children_request_id source: $local.RequestId # 发起子流程的requestID。 - target: subflow_children_exec_name source: $local.ExecutionName # 发起的子流程的执行名称。 - target: subflow_children_flow_name source: $local.FlowName # 发起的子流程的流程名称。
- 同步模式
同步模式中,子流程的输入来源于任务的输入,您可以在子流程中通过
$Input
来获取该输入。子流程的输出(
DescribeExecution
API响应中的Output
)将被传递回主流程作为主流程该步骤的输出,您可以在主流程的后续步骤中使用该输出。如果您需要对子流程的输出进行额外处理,可以使用outputMappings
对输出进行映射。 - 等待回调模式
等待回调模式中,子流程的输入来源于任务的输入,您可以在子流程中通过
$Input
来获取该输入。回调的输出数据将作为主流程该步骤的输出。在
ReportTaskSucceeded
接口中,传入的Output
参数对应的值为主流程该步骤的输出。在ReportTaskFailed
接口中,传入的Error及Cause参数及对应的值将作为主流程该步骤的输出。如果您需要对子流程的输出进行额外处理,可以使用outputMappings
对输出进行映射。