功能概览

本文介绍异步调用的背景信息、应用场景以及如何实现延迟调用函数等。

背景信息

函数计算系统接收异步调用请求后,将请求持久化后会立即返回响应,而不是等待请求执行完成后再返回。函数计算保证请求至少执行一次。如果您希望获得异步调用的结果,可以通过配置异步调用目标来实现,具体信息,请参见结果回调。如果您希望获得函数异步请求各个阶段的状态,可通过开启任务模式来实现,具体信息,请参见功能概览

应用场景

如果您的函数中存在耗时较长、资源消耗较大或容易出错的逻辑,您可以使用异步调用的方式,让您的程序响应更加迅速,更加可靠地应对突发流量。例如:

  • 新用户注册系统中,新用户发送注册请求,注册成功后系统向用户发送注册成功邮件通知,发送邮件的动作可以从注册请求处理流程中剥离,异步执行。

  • 上传文件时,转换格式和导入导出等动作可以从上传数据流程中剥离,异步执行。

说明

HTTP函数支持同步调用和异步调用。更多信息,请参见HTTP调用方式

延迟调用

针对某些场景,您提交一次异步调用后,需要函数计算对其进行延迟触发。您可以通过调用API(SDK)实现延迟调用函数。

在代码中添加HTTP请求头x-fc-async-delay,其取值范围为[0,3600],单位为秒。函数计算将从您触发执行开始计算,延迟x-fc-async-delay设置的时间后触发函数调用。

以Go SDK为例,代码如下所示:

package main

import (
    "fmt"
    "os"
    "github.com/aliyun/fc-go-sdk"
)
func main() {
      /*
        阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
        建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
        本示例以将AccessKey和AccessSecretKey保存在环境变量中实现身份验证为例。
        运行本示例前请先在本地环境中设置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        在FC Runtime运行环境下,配置执行权限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET环境变量会自动被设置。
      */
    fcClient, err := fc.NewClient(fmt.Sprintf("%s.cn-shanghai.fc.aliyuncs.com", os.Getenv("ACCOUNT_ID")),
        "2016-08-15", os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
    if err != nil {
        panic(err)
    }

    // invoke function with delay
    invokeInput := fc.NewInvokeFunctionInput({ServiceName}, {FunctionName}).WithPayload({payload})
    invokeInput = invokeInput.WithAsyncInvocation().WithHeader("x-fc-async-delay", "200")
    _, err := FCClient.InvokeFunction(invokeInput)
    if err != nil {
        panic(err)
    }
}
重要

通过上述操作实现的延迟调用在某些场景下存在一定误差,如果您需要更加精准的延迟调用函数,请使用定时触发器。具体信息,请参见定时触发器

常见功能

异步调用的常见功能如下所示: