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

功能原理

结果回调流程如下图所示:

异步调用流程示意图

适用场景

  • 保存丢弃的事件供后续使用

    当异步请求执行失败,并且按照指定的策略重试后仍然失败,函数计算将丢弃该请求。如果您配置了失败目标,函数计算将自动把失败请求的上下文信息推送到消息队列RocketMQ版等消息服务中,以便后续处理。您也可以将目标服务设置为另一个函数,函数计算将自动把失败请求的上下文信息推送到该函数,执行您自定义的错误处理逻辑。

  • 自动通知下游服务执行结果

    请求执行成功后,如果您配置了成功目标,函数计算系统会自动将成功请求的上下文信息推送到下游目标服务。

支持的异步调用目标服务

当您为函数配置了异步调用目标,并且异步调用后的结果符合条件时,函数计算会将请求上下文和数据推送至对应服务。您可以针对不同函数、别名和版本配置不同的目标服务。目前支持的异步调用目标服务如下:
  • 消息服务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": ""
    }
    表 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": 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
  • 避免循环调用

    当您在配置异步执行目标时,请务必保证不要出现循环调用的情况。例如,您为函数A配置了成功调用时的异步目标为函数B,为函数B配置了成功调用时的异步目标为函数A。当您异步触发函数A并且执行成功后,则可能出现A到B,再到A的循环调用的情况。

配置异步调用目标服务

说明 配置异步调用目标前,请先创建函数并确保服务中函数所使用的角色具有对应的云服务权限。具体信息,请参见授予函数计算访问其他云服务的权限
  • 消息服务MNSmns:SendMessagemns:PublishMessage
  • 函数计算fc:InvokeFunction
  • 事件总线EventBridgeeventbridge:PutEvents
  • 消息队列RocketMQ版mq:PUB
  1. 登录函数计算控制台
  2. 在左侧导航栏,单击服务及函数
  3. 在顶部菜单栏,选择地域。
  4. 服务列表页面,单击目标服务。
  5. 函数管理页面,单击目标函数名称。
  6. 在目标函数详情页面,单击异步配置页签。
  7. 异步配置页签,按需配置参数信息。
    • 配置成功目标
      1. 成功目标区域,单击编辑
      2. 编辑成功目标面板,单击启用,然后配置当函数成功执行后将执行信息发送的目标云服务。参数信息如下:
        参数 说明
        成功时调用其他服务 启用该功能后,您可以在函数执行成功后将执行信息发送给其他目标服务。
        目标服务 函数计算。当目标服务选择的是函数计算时,需配置以下参数信息:
        • 服务名称:指定目标服务的名称。
        • 版本或别名:指定服务的别名或版本。
        • 函数名称:指定目标函数的名称。
        消息服务MNS。当目标服务选择的是消息服务MNS时,需配置以下参数信息:
        • 目标类型:按需选择目标类型,取值为:
          • 队列

            队列模型提供高可靠、高并发的一对一消费模型,即队列中的每一条消息都只能够被某一个消费者消费。

          • 主题

            主题模型提供一对多的发布订阅模型,支持消息通知。

        • 队列:设置消息服务MNS的队列名称。当目标类型选择的是队列时需设置此参数。
        • 主题:选择消息服务MNS的主题名称。当目标类型选择的是主题时需设置此参数。
        消息队列RocketMQ版,当目标服务选择的是消息队列RocketMQ版时,需配置以下参数信息:
        • 实例:选择目标实例。
        • Topic:选择目标Topic。
        事件总线EventBridge。当目标服务选择的是事件总线EventBridge时,需指定自定义事件总线
      3. 单击确定
    • 配置失败目标
      1. 失败目标区域,单击编辑
      2. 编辑失败目标面板,单击启用,然后配置当函数执行失败后将执行信息发送的目标云服务。

        您可以参照配置成功目标的参数描述,配置失败目标的参数信息。

      3. 单击确定
    触发函数后,函数执行成功或失败后,您将从配置的目标服务中读取以下内容:
    {
        "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": ""
    }

回调失败的处理

当服务角色无目标服务访问权限或目标服务不可用时,回调目标服务可能会失败。函数计算提供了相关的指标及日志,您可以根据需要进行相应处理。常见的错误及系统行为如下所示:

错误码 错误原因 系统行为
5xx 限流或内容错误等。 函数计算系统内部按指数退避自动重试。初始重试间隔为500毫秒,最大重试时长为30分钟。
4xx 无权限、请求参数不正确(如目标服务的资源已被删除)或请求消息体超过目标服务限额等。 返回错误并记录错误信息。

结果回调指标

当回调目标服务失败后,函数计算会记录相应指标并展示到控制台。您可以登录函数计算控制台,在左侧导航栏选择高级功能 > 监控大盘,然后在服务名称列表单击目标服务名称,查看服务维度的指标情况。关于目标服务功能的指标,如下所示:

指标名称 描述
目标触发失败(FunctionDestinationErrors) 函数异步调用配置Destination时,函数执行中触发目标失败的请求数。按1分钟或1小时粒度统计求和。
目标触发成功(FunctionDestinationSucceed) 函数异步调用配置Destination时,函数执行中触发目标成功的请求数。按1分钟或1小时粒度统计求和。

更多监控指标,请参见监控指标

更多信息

您不仅可以通过函数计算控制台配置异步调用目标服务,还可以通过以下方式配置: