本文介紹異步調用的背景信息、應用場景以及如何實現延遲調用函數等。
背景信息
函數計算系統接收異步調用請求后,將請求持久化后會立即返回響應,而不是等待請求執行完成后再返回。函數計算保證請求至少執行一次。如果您希望獲得異步調用的結果,可以通過配置異步調用目標來實現,具體信息,請參見結果回調。如果您希望獲得函數異步請求各個階段的狀態,可通過開啟任務模式來實現,具體信息,請參見功能概覽。
應用場景
如果您的函數中存在耗時較長、資源消耗較大或容易出錯的邏輯,您可以使用異步調用的方式,讓您的程序響應更加迅速,更加可靠地應對突發流量。例如:
新用戶注冊系統中,新用戶發送注冊請求,注冊成功后系統向用戶發送注冊成功郵件通知,發送郵件的動作可以從注冊請求處理流程中剝離,異步執行。
上傳文件時,轉換格式和導入導出等動作可以從上傳數據流程中剝離,異步執行。
說明
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)
}
}
重要
通過上述操作實現的延遲調用在某些場景下存在一定誤差,如果您需要更加精準的延遲調用函數,請使用定時觸發器。具體信息,請參見定時觸發器。
常見功能
異步調用的常見功能如下所示:
文檔內容是否對您有幫助?