本文介绍了任务步骤和其相关使用示例。
参数说明
任务(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
:跳转目的步骤名称。说明 该目的步骤只能是和当前任务步骤并列的一个步骤。
函数执行状态 | FC响应HTTP Code | FC响应 | Serverless 工作流步骤失败(用于重试和捕获) | 是否需要重试 |
没有执行 | 429 | ResourceExhausted | FC.ResourceExhausted | 是 |
没有执行 | 4xx,非429 | ServiceNotFound 、FunctionNotFound 、InvalidArgument 等 | FC.ServiceNotFound 、FC.FunctionNotFound 、FC.InvalidArgument 等 | 否 |
不确定 | 500 | InternalServerError | FC.InternalServerError | 是 |
没有执行 | 503 | ResourceThrottled | FC.ResourceThrottled | 是 |
函数执行成功,返回错误。 | 200 | 用户自定义错误,包含errorType 。 | errorType | 根据业务决定 |
函数执行异常,返回错误。 | 200 | 无errorType | FC.Unknown | 是 |
函数执行成功,返回非JSON对象。 | 200 | 无errorType | FC.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工作流控制台的流程页面,单击右上角的头像查看,如下图所示。
- 函数定义
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\"}}",