本文介绍异步调用的背景信息、应用场景以及如何实现延迟调用函数等。
背景信息
函数计算系统接收异步调用请求后,将请求持久化后会立即返回响应,而不是等待请求执行完成后再返回。函数计算保证请求至少执行一次。如果您希望获得异步调用的结果,可以通过配置异步调用目标来实现,具体信息,请参见结果回调。如果您希望获得函数异步请求各个阶段的状态,可通过开启任务模式来实现,具体信息,请参见功能概览。
应用场景
如果您的函数中存在耗时较长、资源消耗较大或容易出错的逻辑,您可以使用异步调用的方式,让您的程序响应更加迅速,更加可靠地应对突发流量。例如:
新用户注册系统中,新用户发送注册请求,注册成功后系统向用户发送注册成功邮件通知,发送邮件的动作可以从注册请求处理流程中剥离,异步执行。
上传文件时,转换格式和导入导出等动作可以从上传数据流程中剥离,异步执行。
说明
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)
}
}
重要
通过上述操作实现的延迟调用在某些场景下存在一定误差,如果您需要更加精准的延迟调用函数,请使用定时触发器。具体信息,请参见定时触发器。
常见功能
异步调用的常见功能如下所示: