结果回调
函数计算接收异步调用请求后,将请求持久化后会立即返回响应,无需等待请求执行完成。如您需要保留执行失败且超过最大重试次数被丢弃的请求,或通知下游异步调用结果,可以通过配置结果回调功能实现。配置异步目标服务后,异步调用请求执行完成,函数计算根据执行结果自动回调对应的服务。
功能原理
结果回调流程如下图所示。
适用场景
保存丢弃的事件供后续使用
当异步请求执行失败,并且按照指定的策略重试后仍然失败,函数计算将丢弃该请求。如果您配置了失败目标,函数计算将自动把失败请求的上下文信息推送到消息队列 RocketMQ 版等消息服务中,以便后续处理。您也可以将目标服务设置为另一个函数,函数计算将自动把失败请求的上下文信息推送到该函数,执行您自定义的错误处理逻辑。
自动通知下游服务执行结果
请求执行成功后,如果您配置了成功目标,函数计算系统会自动将成功请求的上下文信息推送到下游目标服务。例如,您配置了使用函数计算实现自动解压上传到OSS的ZIP文件,解压完成后想要接收消息通知,可采用为目标函数配置异步调用结果回调目标服务。
支持的异步调用目标服务
当您为函数配置了异步调用目标,并且异步调用后的结果符合条件时,函数计算会将请求上下文和数据推送至对应服务。您可以针对不同函数、别名和版本配置不同的目标服务。目前支持的异步调用目标服务如下:
消息服务 MNS
函数计算
事件总线 EventBridge
消息队列 RocketMQ 版
仅支持将云消息队列 RocketMQ 版的4.0系列实例配置为目标服务,不支持将5.0系列实例设置为目标服务。更多信息,请参见4.x和5.x版本差异及兼容性说明。
异步调用目标服务的配置说明如下:
异步调用目标的事件内容
消息服务 MNS、函数计算或消息队列 RocketMQ 版作为函数异步调用目标时,事件内容示例如下。
{ "timestamp": 1660120276975, "requestContext": { "requestId": "xxx", "functionArn": "acs:fc:{regionid}:{accountid}:functions/xxxx", "condition": "FunctionResourceExhausted", "approximateInvokeCount": 3 }, "requestPayload": "", "responseContext": { "statusCode": 200, "functionError": "" }, "responsePayload": "" }
表 1. 参数说明 参数
说明
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:{regionid}:{accountid}:functions/xxxx" }, "requestPayload": "", "responsePayload": "", "responseContext": { "functionError": "", "statusCode": 200 }, "timestamp": 1660120276975 }, "subject": "acs:fc:{regionid}:{accountid}: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
避免循环调用
当您在配置异步执行目标时,请务必保证不要出现循环调用的情况。例如,您为函数A配置了成功调用时的异步目标为函数B,为函数B配置了成功调用时的异步目标为函数A。当您异步触发函数A并且执行成功后,则可能出现A到B,再到A的循环调用的情况。
配置异步调用目标服务
配置异步调用目标前,请先创建函数。
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数配置页面,选择配置页签。
在左侧导航栏,选择异步配置页签,按需配置参数信息。
配置成功目标
在成功目标区域,单击编辑。
在成功目标面板,成功时调用其他服务选择启用,然后配置当函数成功执行后将需要发送结果的目标云服务。参数信息如下:
参数
说明
目标服务
函数计算。当目标服务选择的是函数计算时,需配置以下参数信息:
函数名称:指定目标函数的名称。
版本或别名:指定函数的别名或版本。
消息服务 MNS。当目标服务选择的是消息服务 MNS时,需配置以下参数信息:
目标类型:按需选择目标类型,取值为:
队列:
队列模型提供高可靠、高并发的一对一消费模型,即队列中的每一条消息都只能够被某一个消费者消费。
主题:
主题模型提供一对多的发布订阅模型,支持消息通知。
队列:设置消息服务 MNS的队列名称。当目标类型选择的是队列时需设置此参数。
主题:选择消息服务 MNS的主题名称。当目标类型选择的是主题时需设置此参数。
消息队列 RocketMQ 版,当目标服务选择的是消息队列 RocketMQ 版时,需配置以下参数信息:
实例:选择目标实例。
Topic:选择目标Topic。
事件总线 EventBridge。当目标服务选择的是事件总线 EventBridge时,需指定自定义事件总线。
单击部署。
配置失败目标
在失败目标区域,单击编辑。
在失败目标面板,失败时调用其他服务选择启用,然后配置当函数执行失败后需要发送消息的目标云服务。
配置失败目标的参数,请参见配置成功目标。
单击部署。
回调失败的处理
当函数角色无目标服务访问权限或目标服务不可用时,回调目标服务可能会失败。函数计算提供了相关的指标及日志,您可以根据需要进行相应处理。常见的错误及系统行为如下所示:
错误码 | 错误原因 | 系统行为 |
5xx | 限流或内容错误等。 | 函数计算系统内部按指数退避自动重试。初始重试间隔为500毫秒,最大重试时长为30分钟。 |
4xx | 无权限、请求参数不正确(如目标服务的资源已被删除)或请求消息体超过目标服务限额等。 | 返回错误并记录错误信息。 |
结果回调指标
当回调目标服务失败后,函数计算会记录相应指标并展示到控制台。您可以登录函数计算控制台,在左侧导航栏选择 ,然后在函数名称列表单击目标函数名称,查看服务维度的指标情况。
指标名称 | 描述 |
目标触发失败(FunctionDestinationErrors) | 函数异步调用配置Destination时,函数执行中触发目标失败的请求数。按1分钟或1小时粒度统计求和。 |
目标触发成功(FunctionDestinationSucceed) | 函数异步调用配置Destination时,函数执行中触发目标成功的请求数。按1分钟或1小时粒度统计求和。 |
更多监控指标,请参见监控指标。
更多信息
您还可以通过调用API或使用Serverless Devs工具配置异步调用目标服务。更多信息,请参见PutAsyncInvokeConfig - 设置函数异步配置和Serverless Devs常用命令。
- 本页导读 (1)