任务步骤

本文介绍了任务步骤和其相关使用示例。

参数说明

任务(Task)步骤定义了函数计算服务的函数调用信息,执行任务步骤会调用相应的函数。

任务步骤包含以下属性:

  • type:task表示该步骤是任务步骤。
  • name:步骤名称。
  • resourceArn:资源标识,当前支持函数、消息队列、Serverless 工作流流程,例如acs:fc:cn-shanghai:18807708****3420:services/fnf_test/functions/hello。更多信息,请参见服务集成
  • 可选:pattern:集成服务的执行模式,不同的集成服务支持不同的执行模式。默认值为requestResponse,枚举值如下:
    • requestResponse:同步等待任务执行结束后继续该步骤。
    • sync:异步提交任务后,等待任务执行结束,获得任务返回结果后继续该步骤。
    • waitForCallback:异步提交任务后(例如完成函数调用后)当前步骤暂停,直到收到关于该任务的回调或该任务超时。
  • 可选:timeoutSeconds:任务超时时间。如果任务执行超过指定的超时时间,则任务步骤执行超时。
  • 可选:end:当前步骤结束后是否继续执行其后定义的步骤。
  • 可选:inputMappings:输入映射。任务步骤的输入会被用作函数调用的event,更多信息,请参见InvokeFunction
  • 可选:outputMappings:输出映射。其中的$local是函数调用的返回结果,其格式必须是JSON类型。
    说明 如果未指定输出映射,本步骤默认将$local作为输出。
  • 可选:errorMappings:错误映射。本映射仅在步骤执行出错,且配置catch时生效。可以通过$local.cause$local.error将错误信息映射至输出,并传递给下个步骤。
    说明 $local.error$local.code为系统预留字段,mapping中的source字段必须取这两个值,详细信息,请参见本文示例。另外,errorMappings为可选字段,如果未指定则发生错误后无法在下一步骤获取相关错误信息。
  • retry:定义了一组重试策略,其中每一个重试策略包含以下属性:
    • errors:定义了一个或者多个错误,更多信息,请参见错误定义
    • intervalSeconds:重试的初始间隔时间,最大值是86400秒,默认值是1秒。
    • maxIntervalSeconds:重试的最长间隔时间,最大值和默认值是86400秒。
    • maxAttempts:最多重试次数,默认值是3次。
    • multiplier:后一次重试比前一次重试间隔时间的倍数,默认值是2。
  • catch:定义了一组捕获策略,其中每一个捕获策略包含如下属性:
    • errors:定义了一个或者多个错误,详情请参见下面表格。
    • goto:跳转目的步骤名称。
      说明 该目的步骤只能是和当前任务步骤并列的一个步骤。
表 1. 错误定义
函数执行状态FC响应HTTP CodeFC响应Serverless 工作流步骤失败(用于重试和捕获是否需要重试
没有执行429ResourceExhaustedFC.ResourceExhausted
没有执行4xx,非429ServiceNotFoundFunctionNotFoundInvalidArgumentFC.ServiceNotFoundFC.FunctionNotFoundFC.InvalidArgument
不确定500InternalServerErrorFC.InternalServerError
没有执行503ResourceThrottledFC.ResourceThrottled
函数执行成功,返回错误。200用户自定义错误,包含errorTypeerrorType根据业务决定
函数执行异常,返回错误。200errorTypeFC.Unknown
函数执行成功,返回非JSON对象。200errorTypeFC.InvalidOutput
其他错误
  • FnF.ALL:捕获所有失败情况,用于重试或跳转。

示例

  • 简单任务步骤

    下面的示例流程包含一个任务步骤。

    • 如果流程的输入是{"name": "function flow"},输出是{"hello": "function flow"}
    • 如果流程没有指定输入或者输入不包含name key,则任务步骤执行失败,从而导致整个流程执行失败。
    • 流程定义
      version: v1
      type: flow
      steps:
        - type: task
          name: hello
          resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/hello           
      resourceArn的参数说明如下:
      • {region}:需替换成您选择的地域,例如cn-shanghai
      • {accountID}:需替换成您的账号ID。您可以在Serverless工作流控制台流程页面,单击右上角的头像查看,如下图所示。create_flow_step1
    • 函数定义
      import json
      
      class MyError(Exception):
        pass
      
      def handle(event, context):
        evt = json.loads(event)
        if "name" in evt:
          return {
            "hello": evt["name"]
          }
        else:
          raise MyError("My unhandled exception")          
  • 错误重试

    下面的示例会重试MyError。如果流程没有指定输入或者输入不包含name key,Serverless 工作流服务会根据重试策略多次重试失败任务调用。

    • 在第一次发生错误后等待3秒,然后再次调用函数。
    • 在第二次发生错误后等待6秒(intervalSeconds x multiplier),然后再次调用函数。
    • 在第三次发生错误后等待12秒(intervalSeconds x multiplier x multiplier),然后再次调用函数。
    • 经过三次重试后,函数仍然返回错误,重试次数超过maxAttempts,任务步骤失败,流程以失败结束。
    version: v1
    type: flow
    steps:
      - type: task
        name: hello
        resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/hello
        retry:
          - errors:
            - MyError
            intervalSeconds: 3
            maxAttempts: 3
            multiplier: 2            
  • 错误捕获

    下面的示例会对捕获MyError,然后跳转到final步骤。由于错误被成功捕获,最后流程以成功结束。

    version: v1
    type: flow
    steps:
      - type: task
        name: hello
        resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/hello
        catch:
          - errors:
            - MyError
            goto: final
      - type: pass
        name: pass1
      - type: pass
        name: final           
  • 带错误映射的错误捕获

    下面的示例会对MyError捕获,然后跳转到final步骤。由于进行了错误映射,可以在final步骤中获取错误信息并进行处理。最后流程以成功结束。当然,您也可以将该步骤的输入、常量等在errorMappings中进行输出映射。

    version: v1
    type: flow
    steps:
      - type: task
        name: hello
        resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/hello
        errorMappings:
          - target: errMsg
            source: $local.cause #该值为系统预留,在本步骤发生错误时可直接使用
          - target: errCode
            source: $local.error #该值为系统预留,在本步骤发生错误时可直接使用
        catch:
          - errors:
            - MyError
            goto: final
      - type: pass
        name: pass1
      - type: pass
        name: final  

    映射后在进入final步骤的event中将看到EventDetail为如下内容:

    "EventDetail": "{\"input\":{},\"local\":{\"errorCode\":\"MyError\",\"errorMsg\":\"some message\"}}",