异步调用是调用函数的一种方式,通过异步调用您不仅可以确保函数会至少执行一次,还可以保存调用执行过程中的状态转换信息和执行结果。本文介绍异步调用的基本概念、应用场景、使用限制、配置项,以及如何在函数计算控制台查看函数异步调用指标等。

什么是异步调用

在异步调用中,事件在写入到函数计算内部队列后返回执行结果,函数计算系统会可靠地处理该消息,并返回请求ID,而具体的调用情况和函数执行状态将不会返回。如果您希望获得异步调用的结果,则可以通过配置异步调用目标来实现。

异步调用流程示意图如下所示。异步调用流程示意图
异步调用包含以下调用状态:
  • 无状态异步调用
    无状态异步调用会确保函数至少执行一次。当出现系统硬件错误、系统升级等一些特殊情况时,函数可能会执行多次,从而保证每条消息都会被处理。
    说明 系统默认开启无状态异步调用。
  • 有状态异步调用

    有状态异步调用可以保存调用执行过程中的状态转换信息和执行结果。详细信息,请参见有状态异步调用

适用场景

说明 HTTP函数不支持设置异步调用,例如无状态异步调用和有状态异步调用。

使用限制

资源调用限制:您的阿里云账号(主账号)在单个地域内默认的按量实例上限数为300。
说明 您可以通过函数在云监控控制台中的相关指标(throttles)来观察流控行为。如果您需要提高该限制,请提交工单

针对有状态异步调用的限制信息,请参见使用限制

并发执行

并发执行是指在任意指定时间您的函数代码同时执行的数量。您可以用以下公式来估算并发的函数调用数:

并发调用数=请求速率×函数执行时间
  • 请求速率:函数被调用的速率,即每秒请求数或每秒事件数。
  • 函数执行时间:函数请求到达实例开始,到请求执行完毕的时长。单位为秒。
例如,一个处理阿里云OSS事件的函数的平均执行时间为3秒,OSS每秒发布10个事件,那么根据该公式计算可得,您的函数有30个并发执行。
说明 函数并发执行数会影响您的计费。关于计费的详细信息,请参见计费概述

异步调用的配置项

异步调用包含异步调用目标和异步调用策略部分:

  • 异步调用目标:用于配置获得异步调用结果的目标云服务,映射到数据结构中的destinationConfig
  • 异步调用策略:用于设置是否开启异步调用策略和配置异步调用的消息最大存活时长和重试次数,分别映射到数据结构中的statefulInvocationmaxAsyncEventAgeInSecondsmaxAsyncRetryAttempts

异步调用目标

当您为函数配置了异步调用目标,并且异步调用后的结果符合条件时,函数计算会将异步调用上下文和数据推送至对应服务,以实现云服务之间的联动。您可以针对不同函数、别名和版本配置不同的目标。目前支持的异步目标服务如下:
  • 消息服务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
    说明 调用目标云服务的默认数据,即除了requestPayloadresponsePayload以外的数据大小在1 KB以内。请确保您异步调用入参、函数返回和默认数据大小之和不要超过负载的最大值。
  • 避免循环调用

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

异步调用策略

  • 是否开启有状态异步调用
    异步调用配置中的statefulInvocation用于设置是否开启有状态异步调用,该参数的取值如下:
    • true:表示开启有状态异步调用。
    • false:表示关闭有状态异步调用。
    默认情况下关闭该功能。当开启该功能后,有状态异步调用将保存调用执行过程中所有状态的转换信息。
  • 在一些场景下,如果您的调用负载较高,可能出现消息积压的现象,您可以通过修改以下异步调用配置来忽略存在时间过长的消息:
    • 最大重试次数

      函数计算允许通过异步调用配置中的maxAsyncRetryAttempts参数配置重试次数,取值范围[0,8]。

      函数计算在默认情况下,对异步触发失败的消息进行3次重试,您可以根据业务需求减少或增加对异步调用的重试。

    • 消息最大存活时长

      异步调用配置中的maxAsyncEventAgeInSeconds用于配置消息最大存活时长,取值范围[1,2592000],单位:秒。

      该时长从触发异步调用时开始计算,到该消息出队准备进行处理为止。如果这段时间大于maxAsyncEventAgeInSeconds的配置值,则该条消息将被丢弃。未被消费的消息将计入云监控异步调用触发事件(次)指标。指标详情,请参见监控指标

配置异步调用

函数计算默认开启无状态异步调用。当您需要为无状态异步调用设置调用目标或开启有状态异步调用时,请参见配置有状态异步调用

查看函数异步调用指标(云监控)

当您的服务角色没有目标服务的调用权限、返回消息过大或目标服务异常时可能会导致异步目标调用失败。您可以登录函数计算控制台通过云监控的指标参数来了解详情。

在目标函数的监控指标页签,查看异步调用相关指标信息,如下图所示。关于监控指标的详细介绍,请参见监控指标yibudiaoyongzhibiaoxintu

其他配置方式

您不仅可以通过函数计算控制台配置同步调用或异步调用,也可以通过以下方式配置: