全部产品
Search
文档中心

云工作流:集成Serverless工作流

更新时间:Oct 30, 2023

集成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对输出进行映射。