结果回调

函数计算接收异步调用请求后,将请求持久化后会立即返回响应,无需等待请求执行完成。如您需要保留执行失败且超过最大重试次数被丢弃的请求,或通知下游异步调用结果,可以通过配置结果回调功能实现。配置异步目标服务后,异步调用请求执行完成后,函数计算根据执行结果自动回调对应的服务。

功能原理

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

image

适用场景

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

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

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

    请求执行成功后,如果您配置了成功目标,函数计算系统会自动将成功请求的上下文信息推送到下游目标服务。例如,您配置了使用函数计算实现自动解压上传到OSS的ZIP文件,解压完成后想要接收消息通知,可采用为目标函数配置异步调用结果回调目标服务。

支持的异步调用目标服务

当您为函数配置了异步调用目标,并且异步调用后的结果符合条件时,函数计算会将请求上下文和数据推送至对应服务。您可以针对不同函数、别名和版本配置不同的目标服务。目前支持的异步调用目标服务如下:

  • 轻量消息队列(原 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:SendMessagemns:PublishMessage

  • 函数计算fc:InvokeFunction

  • 事件总线EventBridgeeventbridge:PutEvents

  • 云消息队列 RocketMQ 版mq:PUB

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数
  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
  3. 函数管理页面,单击目标函数名称,然后在目标函数详情页面,单击异步配置页签。

  4. 异步配置页签,按需配置参数信息。

    • 配置成功目标

      1. 成功目标区域,单击编辑

      2. 编辑成功目标面板,成功时调用其他服务选择启用,然后配置当请求执行成功后需要发送结果的目标云服务。参数信息如下:

        参数

        说明

        目标服务

        函数计算。当目标服务选择的是函数计算时,需配置以下参数信息:

        • 服务名称:指定目标服务的名称。

        • 版本或别名:指定服务的别名或版本。

        • 函数名称:指定目标函数的名称。

          说明

          仅支持将函数计算的事件函数配置为目标服务,不支持将HTTP函数配置为目标服务。

        轻量消息队列(原 MNS)。当目标服务选择的是轻量消息队列(原 MNS)时,需配置以下参数信息:

        • 目标类型:按需选择目标类型,取值为:

          • 队列

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

          • 主题

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

        • 队列:设置轻量消息队列(原 MNS)的队列名称。当目标类型选择的是队列时需设置此参数。

        • 主题:选择轻量消息队列(原 MNS)的主题名称。当目标类型选择的是主题时需设置此参数。

        云消息队列 RocketMQ 版,当目标服务选择的是云消息队列 RocketMQ 版时,需配置以下参数信息:

        • 实例:选择目标实例。

        • Topic:选择目标Topic。

        事件总线EventBridge。当目标服务选择的是事件总线EventBridge时,需指定自定义事件总线

      3. 单击确定

    • 配置失败目标

      1. 失败目标区域,单击编辑

      2. 编辑失败目标面板,失败时调用其他服务选择启用,然后配置当请求执行失败后需要发送结果的目标云服务。

        配置失败回调目标的参数,请参见配置成功目标

      3. 单击确定

    触发函数后,函数执行成功或失败后,您将从配置的目标服务中读取以下内容:

    {
        "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小时粒度统计求和。

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

更多信息

  • 您还可以通过调用API或使用Serverless Devs工具配置异步调用目标服务。更多信息,请参见API参考Serverless Devs操作命令

  • HTTP函数不支持作为回调目标函数,但HTTP函数支持同步调用和异步调用,更多信息,请参见HTTP调用方式

  • 您还可以在配置异步调用结果回调功能的同时开启异步任务模式,具体信息,请参见异步任务