集成 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 接口中,传入的 ErrorCause 参数及对应的值将作为主流程该步骤的输出。如果您需要对子流程的输出进行额外处理,可以使用 outputMappings 对输出进行映射。