函数计算异步调用支持结果自动回调功能。当任务执行完成后,函数计算将根据执行结果自动回调对应的服务。此功能需要您配置异步目标服务。本文介绍结果回调功能原理、适用场景和支持的异步目标服务,以及如何在函数计算控制台配置异步目标服务。
功能原理
结果回调流程如下图所示。

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