函数计算支持异步调用的相关配置,让您可以在函数执行成功或者失败后将执行结果发送给其他目标服务,您也可以设置异步调用的重试次数和消息存活时长。本文介绍函数异步调用的基本概念、配置项、配置方法以及监控指标。
什么是异步调用
函数触发分为异步调用和同步调用。通过InvokeFunction接口来调用函数时,您可以指定调用方式。除此之外,针对设定了以下触发器的场景,您的函数将被异步调用:
当函数的异步调用被触发后,函数计算会将触发事件放入内部队列中,并返回请求ID,而具体的调用情况及函数执行状态将不会返回。如果您希望获得异步调用的结果,则可以通过配置异步调用目标来实现。
异步调用的配置项
异步调用配置包含以下两部分:
- 异步调用目标:用于配置获得异步调用的结果的目标云服务,映射到数据结构中的destinationConfig。
- 异步调用策略:用于配置异步调用的消息最大存活时长和重试策略,分别映射到数据结构中的maxAsyncEventAgeInSeconds和maxAsyncRetryAttempts。
异步调用目标
- 消息服务MNS队列模型
- 消息服务MNS主题模型
- 函数计算
- 事件总线EventBridge说明 支持将事件总线EventBridge配置为目标服务的地域包括华东1(杭州)、华东2(上海)、美国(硅谷)、美国(弗吉尼亚)、华北2(北京)以及中国(香港)。
- 消息队列RocketMQ版说明 支持将消息队列RocketMQ版配置为目标服务的地域包括华东1(杭州)和华北1(青岛)。
异步调用目标的配置说明如下:
- 异步调用目标的事件内容
{ "timestamp": "2020-08-20T12:00:00.000Z", "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:::services/{serviceName}/functions/{functionName}", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }
参数 说明 timestamp 调用时间戳。 requestContext 请求上下文。 requestContext.requestId 异步调用的请求ID。 requestContext.functionArn 异步执行的函数ARN。 requestContext.condition 调用错误码。 requestContext.approximateInvokeCount 异步调用的执行次数。当该值大于1时,说明函数计算对您的函数进行了重试。 requestPayload 请求函数的原始负载。 responseContext 返回上下文。 responseContext.statusCode 调用函数的返回码(系统)。当该返回码不为200时,说明出现了系统错误。 responseContext.functionError 调用错误信息。 responsePayload 执行函数返回的原始负载。 需注意的是,事件总线EventBridge作为函数异步调用目标时,事件内容会多一些参数,这些参数的更多信息,请参见事件概述。具体示例如下:
{ "datacontenttype": "application/json", "aliyunaccountid": "143xxxx", "data": { "requestContext": { "condition": "", "approximateInvokeCount": 1, "requestId": "0fcb7f0c-xxxx", "functionArn": "acs:fc:::services/xxxx.LATEST/functions/xxxx" }, "requestPayload": "", "responsePayload": "", "responseContext": { "functionError": "", "statusCode": 200 }, "timestamp": 12345 }, "subject": "acs:fc:::services/xxxx.LATEST/functions/xxxx", "source": "acs:fc", "type": "fc:AsyncInvoke:succeeded", "aliyunpublishtime": "2021-01-03T09:44:31.233Asia/Shanghai", "specversion": "1.0", "aliyuneventbusname": "xxxxxxx", "id": "ecc4865xxxxxx", "time": "2021-01-03T01:44:31Z", "aliyunregionid": "cn-shanghai-vpc", "aliyunpublishaddr": "199.99.xxx.xxx" }
- 负载限制
支持的异步调用目标云服务负载的最大限制如下:
- MNS队列或主题模型:64 KB
- 函数计算:128 KB
- 事件总线EventBridge:64 KB
- 消息队列RocketMQ版:4 MB
说明 调用目标云服务的默认数据,即除了requestPayload和responsePayload以外的数据大小在1 KB以内。请确保您异步调用入参、函数返回和默认数据大小之和不要超过负载的最大值。 - 避免循环调用
当您在配置异步执行目标时,请务必保证不要出现循环调用的情况。例如,您为函数A配置了成功调用时的异步目标为函数B,为函数B配置了成功调用时的异步目标为函数A。当您异步触发函数A并且执行成功后,则可能出现A——>B——>A......循环调用的情况。
异步调用策略
在一些场景下,如果您的调用负载较高,可能出现消息积压的现象,您可以通过修改以下异步调用配置来忽略存在时间过长的消息:
- 消息最大存活时长
异步调用配置中的maxAsyncEventAgeInSeconds用于配置消息最大存活时长,取值范围[1,2592000],单位:秒。该时长从触发异步调用时开始计算,到该消息出队准备进行处理为止。如果这段时间长于maxAsyncEventAgeInSeconds的配置值,该条消息将被丢弃。未被消费的消息将计入云监控异步消息超时丢弃指标。指标详情,请参见下文中的查看函数异步调用指标(云监控)。
- 错误重试次数
函数计算允许通过异步调用配置中的maxAsyncRetryAttempts参数配置重试次数,取值范围[0,8]。函数计算在默认情况下,对异步触发失败的消息进行3次重试,您可以根据业务需求减少或增加对异步调用的重试。
异步调用配置的数据结构
异步调用配置的数据结构如下。
{
"destinationConfig": {
"onSuccess": {
"destination": "acs:fc:{region}:{account}:services/{service_name}.{Qualifier}/functions/{function_name}}",
},
"onFailure": {
"destination": "acs:mns:{region}:{account}:/queues/{queue_name}/messages"
}
}
"maxAsyncEventAgeInSeconds": 100,
"maxAsyncRetryAttempts": 1
}
参数 | 说明 |
---|---|
destinationConfig | 异步调用目标。 |
onSuccess | 当函数执行成功时,函数计算将调用该配置对应的目标。 |
onFailure | 当函数执行失败(系统错误或函数内部错误)时,函数计算将调用该配置对应的目标。 |
destination | 异步调用目标,取值如下:
ARN中涉及的参数说明如下:
例如,消息服务MNS的队列模型对应的ARN为 |
maxAsyncEventAgeInSeconds | 消息最大存活时长,取值范围[1,2592000]。单位:秒。 |
maxAsyncRetryAttempts | 异步调用失败后的最大重试次数,默认值为3。取值范围[0,8]。 |
配置方式
针对任一异步调用的配置方式,都需确保函数的服务角色具备相应目标服务的权限。
目标服务 | 要求的最小权限 |
---|---|
消息服务MNS队列模型 | mns:SendMessage |
消息服务MNS主题模型 | mns:PublishMessage |
函数计算 | fc:InvokeFunction |
事件总线EventBridge | eventbridge:PutEvents |
消息队列RocketMQ版 | AliyunMQPubOnlyAccess |
更多信息,请参见权限简介。
使用控制台配置
其他相关操作
- 如需修改已保存的异步调用配置,您可直接在异步配置页签,按需修改相应参数,然后再单击保存配置。
注意 该修改为增量更新,如果您需要清除某项设置,请先删除该配置后重新创建异步配置。
- 如需删除已保存的异步调用配置,您可直接在异步配置页签,单击删除配置。
- 如需查看异步调用相关监控指标,请参见下文中的查看函数异步调用指标(云监控)。
使用SDK配置
更多信息,请参见SDK列表。
使用API配置
FunctionAsyncInvokeConfig API支持配置某个服务(可包含具体版本或别名)下的某个函数的异步调用配置。
API | 说明 |
---|---|
PutFunctionAsyncInvokeConfig | 创建或修改一个服务下某个函数的异步调用配置。 |
GetFunctionAsyncInvokeConfig | 查询一个服务下某个函数的异步调用配置。 |
ListFunctionAsyncInvokeConfigs | 查询一个服务下某个函数的所有异步调用配置。 |
DeleteFunctionAsyncInvokeConfig | 删除一个服务下某个函数的异步调用配置。 |
查看函数异步调用指标(云监控)
当您的服务角色没有目标服务的调用权限、返回消息过大或目标服务异常时可能会导致异步目标调用失败。您可以通过云监控的相关指标来了解详情。