函数计算支持异步调用函数,让您可以将函数的执行状态信息例如执行中、执行失败或执行成功等发送给其他目标服务,您也可以设置异步调用的重试次数和消息存活时长。本文介绍函数异步调用的基本概念、适用场景和使用限制等。

什么是异步调用

函数调用分为异步调用和同步调用。通过InvokeFunction接口来调用函数时,您可以指定调用方式。除此之外,针对设定了以下触发器的场景,您的函数将被异步调用:

当函数的异步调用被触发后,函数计算会将触发事件放入内部队列中,并返回请求ID,而具体的调用情况和函数执行状态将不会返回。如果您希望获得异步调用的结果,则可以通过配置异步调用目标来实现。

异步调用流程示意图如下所示。异步调用流程示意图

适用场景

  • 无状态异步调用的适用场景:
    • 函数执行时间短。
    • 不需要经常查看每个执行结果。
    • 不需要停止正在执行的函数。
  • 有状态异步调用的适用场景:
    • 函数执行时间长。
    • 需要查看每次执行的结果。
    • 在执行函数的过程中需要中断函数的执行。
    说明 由于有状态异步调用需要保存状态信息,函数的调用和执行将会有一定的额外延迟。该延迟不会产生额外的费用,计费的详细信息,请参见计费概述

使用限制

有状态异步调用使用限制如下所示:
  • 仅支持查询7日内的执行数据信息。
  • 目前支持有状态异步调用的地域包含华东1(杭州)、华东2(上海)、华北2(北京)、华南1(深圳)、华北3(张家口)、中国香港、新加坡、英国(伦敦)、美国(硅谷)、美国(弗吉尼亚)、德国(法兰克福)、澳大利亚(悉尼)和印度(孟买)。

异步调用的配置项

异步调用包含以下部分:

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

异步调用目标

当您为函数配置了异步调用目标,并且异步调用后的结果符合条件时,函数计算会将异步调用上下文和数据推送至对应服务,以实现云服务之间的联动。您可以针对不同函数、别名和版本配置不同的目标。目前支持的异步目标服务如下:
  • 消息服务MNS队列模型
  • 消息服务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": ""
    }
    参数 说明
    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......循环调用的情况。

异步调用策略

  • 在一些场景下,如果您的调用负载较高,可能出现消息积压的现象,您可以通过修改以下异步调用配置来忽略存在时间过长的消息:
    • 消息最大存活时长

      异步调用配置中的maxAsyncEventAgeInSeconds用于配置消息最大存活时长,取值范围[1,2592000],单位:秒。该时长从触发异步调用时开始计算,到该消息出队准备进行处理为止。如果这段时间长于maxAsyncEventAgeInSeconds的配置值,该条消息将被丢弃。未被消费的消息将计入云监控异步消息超时丢弃指标。指标详情,请参见下文中的查看函数异步调用指标(云监控)

    • 错误重试次数

      函数计算允许通过异步调用配置中的maxAsyncRetryAttempts参数配置重试次数,取值范围[0,8]。函数计算在默认情况下,对异步触发失败的消息进行3次重试,您可以根据业务需求减少或增加对异步调用的重试。

  • 开启有状态异步调用

    异步调用配置中的statefulInvocation用于设置是否开启有状态异步调用,当该参数设置为true时,表示开启有状态异步调用,当该参数设置为false时,表示关闭有状态异步调用。默认情况下关闭该功能。当开启该功能后,有状态异步调用将保存调用执行过程中所有状态的转换信息。

异步调用配置的数据结构

异步调用配置的数据结构如下:
  • 无状态异步调用配置的数据结构如下。
    {
      "destinationConfig": {
            "onSuccess": {
              "destination": "acs:fc:{region}:{account}:services/{service_name}.{Qualifier}/functions/{function_name}}",
            },
            "onFailure": {
              "destination": "acs:mns:{region}:{account}:/queues/{queue_name}/messages"
            }
      }
      "maxAsyncEventAgeInSeconds": 100,
      "maxAsyncRetryAttempts": 1
    }
  • 有状态异步调用配置的数据结构如下。
    {
      "statefulInvocation": true,
      "destinationConfig": {
            "onSuccess": {
              "destination": "acs:fc:{region}:{account}:services/{service_name}.{Qualifier}/functions/{function_name}}",
            },
            "onFailure": {
              "destination": "acs:mns:{region}:{account}:/queues/{queue_name}/messages"
            }
      },
      "maxAsyncEventAgeInSeconds": 100,
      "maxAsyncRetryAttempts": 1
    }
表 1. 异步调用配置的参数说明
参数 说明
statefulInvocation 是否开启有状态异步调用。
destinationConfig 异步调用的目标。
onSuccess 当函数执行成功时,函数计算将调用该配置对应的目标。
onFailure 当函数执行失败(系统错误或函数内部错误)时,函数计算将调用该配置对应的目标。
destination 异步调用目标,取值如下:
  • mns/queues:消息服务MNS的队列模型,对应的ARN格式为acs:mns:{region}:{accountId}:/queues/{queue_name}/messages
  • mns/topics:消息队列MNS的主题模型,对应的ARN格式为acs:mns:{region}:{accountId}:/topics/{topic_name}/messages
  • fc:函数计算,对应的ARN格式为acs:fc:{region}:{accountId}:services/{service_name}.{Qualifier}/functions/{function_name}
  • eventbridge:事件总线EventBridge,对应的ARN格式为acs:eventbridge:{region}:{accountId}:eventbus/{busName}
  • rocketmq:消息队列RocketMQ版,对应的ARN格式为cs:mq:{region}:{accountId}:{mq_instance_id}%{topic_name}
ARN中涉及的参数说明如下:
  • {region}:地域ID,更多信息,请参见服务地址
  • {accountId}:账号ID,更多信息,请参见获取账号ID
  • {queue_name}:消息服务MNS的队列名称。
  • {topic_name}:消息服务MNS的主题名称或消息队列RocketMQ版的Topic。
  • {service_name}:函数计算的服务名称。
  • {Qualifier}:函数计算的服务别名。
  • {function_name}:函数名称。
  • {mq_instance_Id}消息队列RocketMQ版的实例ID。

例如,消息服务MNS的队列模型对应的ARN为acs:mns:cn-hangzhou:1111******:/queues/myqueue/messages

maxAsyncEventAgeInSeconds 消息最大存活时长,取值范围[1,2592000]。单位:秒。
maxAsyncRetryAttempts 异步调用失败后的最大重试次数,默认值为3。取值范围[0,8]。

配置方式

针对任一异步调用的配置方式,都需确保函数的服务角色具备相应目标服务的权限。

目标服务 要求的最小权限
消息服务MNS队列模型 mns:SendMessage
消息服务MNS主题模型 mns:PublishMessage
函数计算 fc:InvokeFunction
事件总线EventBridge eventbridge:PutEvents
消息队列RocketMQ版 AliyunMQPubOnlyAccess

更多信息,请参见通过阿里云账号给RAM用户授权

使用控制台配置

  1. 登录函数计算控制台
  2. 在顶部菜单栏,选择地域。
  3. 在左侧导航栏中,单击服务及函数。在服务列表区域,单击目标服务。
  4. 函数列表页签,单击目标函数名称。
  5. 单击异步调用页签。
  6. 单击配置异步调用
    说明 如果已配置过异步调用,请忽略此步骤。
  7. 在目标函数页面右上角版本的下拉列表内,选择您需要配置和查看的目标函数的版本。
  8. 异步调用页签,完成以下参数配置。
    参数配置
    参数 示例 说明
    异步策略配置
    最大重试次数 1 异步调用失败后的最大重试次数,默认值为3。取值范围[0,8]。
    消息最大有效期 1 消息最大存活时长,取值范围[1,2592000]。单位:秒。
    开启有状态异步调用 开启有状态异步调用时,函数计算将记录下每次调用过程的详细状态转换信息,例如调用输入、执行结果和错误信息等。
    说明 当您开启有状态异步调用失败时,请提交工单咨询。
    Destination配置条件:成功时
    目标类型 fc 异步调用的目标服务,此选项将影响目标配置。可选值如下:
    • fc:函数计算
    • mns/queues:消息服务MNS的队列模型。
    • mns/topics:消息队列MNS的主题模型。
    • eventbridge事件总线EventBridge
    • rocketmq消息队列RocketMQ版
    服务 fnf-demo 函数计算的服务。
    说明 如果目标类型fc,则需配置此参数,否则无需填写。
    版本/别名 2 函数计算服务的版本或别名。
    说明 如果目标类型fc,则需配置此参数,否则无需填写。
    函数 Operation 函数名称。
    说明 如果目标类型fc,则需配置此参数,否则无需填写。
    队列名 MyQueue 消息服务MNS的队列名。
    说明 如果目标类型mns/queues,则需配置此参数,否则无需填写。
    主题名 MyTopic 消息服务MNS的主题名。
    说明 如果目标类型mns/topics,则需配置此参数,否则无需填写。
    目标 acs:fc:cn-hangzhou:188077086902****:services/fnf-demo.2/functions/Operation 目标服务的ARN。
    Destination配置条件:失败时

    请参照异步调用成功时的参数说明填写相关参数。

  9. 单击保存配置
    页面弹出保存成功提示信息。

其他相关操作

  • 如需修改已保存的异步调用信息,您可直接在异步调用页签,按需修改相应参数,然后再单击保存配置
    注意 该修改为增量更新,如果您需要清除某项设置,请先删除该配置后重新创建异步配置。
  • 如需删除已保存的异步调用信息,您可直接在异步配置页签,单击删除配置
  • 如需查看异步调用相关监控指标,请参见查看函数异步调用指标(云监控)

使用SDK配置

更多信息,请参见SDK列表

使用API配置

API 说明
FunctionAsyncInvokeConfig API支持配置某个服务(可包含具体版本或别名)下的某个函数的异步调用配置。
PutFunctionAsyncInvokeConfig 创建或修改一个服务下某个函数的异步调用配置。
GetFunctionAsyncInvokeConfig 查询一个服务下某个函数的异步调用配置。
ListFunctionAsyncInvokeConfigs 查询一个服务下某个函数的所有异步调用配置。
DeleteFunctionAsyncInvokeConfig 删除一个服务下某个函数的异步调用配置。
StatefulAsyncInvocation API支持查看具体的执行信息、查看符合某种条件的执行列表和终止异步调用等操作。
GetStatefulAsyncInvocation 查询有状态异步调用。
ListStatefulAsyncInvocations 列举有状态异步调用中符合某些条件的所有异步调用,例如:
  • 列举指定数量的异步调用。
  • 列举状态为failed的异步调用。
  • 列举开始时间在某个执行时间段的异步调用。
StopStatefulAsyncInvocation 停止某次有状态异步调用。

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

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

  1. 登录函数计算控制台
  2. 在顶部菜单栏,选择地域。
  3. 在左侧导航栏单击服务及函数,在服务列表区域,单击目标服务。
  4. 函数列表页签,单击目标函数名称。
  5. 单击函数指标页签。
  6. 函数指标页签,按需选择时间范围,则可查看相关指标。
    timespan
    您所查看到的指标示例图如下,与异步调用相关的指标在方框中。metrics-result

    异步调用的监控指标说明如下:

    • 错误率:函数计算尝试将异步调用事件发送到目标服务的总次数,以及由于服务端、客户端和函数问题而导致的错误率。权限错误、资源误配或超过大小限制都可能会导致错误率指标出现。
    • 异步调用目标发送指标:函数计算将异步调用事件成功发送到目标服务和发送失败的次数。
    • 异步消息超时丢弃:配置maxAsyncEventAgeInSeconds后,消息超出生命周期而被忽略的个数。