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