本文介紹非同步呼叫的背景資訊、應用情境以及如何?延遲調用函數等。
背景資訊
Function Compute系統接收非同步呼叫請求後,將請求持久化後會立即返迴響應,而不是等待請求執行完成後再返回。Function Compute保證請求至少執行一次。如果您希望獲得非同步呼叫的結果,可以通過配置非同步呼叫目標來實現,具體資訊,請參見結果回調。如果您希望獲得函數非同步請求各個階段的狀態,可通過開啟任務模式來實現,具體資訊,請參見功能概覽。
應用情境
如果您的函數中存在耗時較長、資源消耗較大或容易出錯的邏輯,您可以使用非同步呼叫的方式,讓您的程式響應更加迅速,更加可靠地應對突發流量。例如:
新使用者註冊系統中,新使用者發送註冊請求,註冊成功後系統向使用者發送註冊成功郵件通知,發送郵件的動作可以從註冊請求處理流程中剝離,非同步執行。
上傳檔案時,轉換格式和匯入匯出等動作可以從上傳資料流程中剝離,非同步執行。
說明
HTTP函數支援同步調用和非同步呼叫。更多資訊,請參見HTTP調用方式。
延遲調用
針對某些情境,您提交一次非同步呼叫後,需要Function Compute對其進行延遲觸發。您可以通過調用API(SDK)實現延遲調用函數。
在代碼中添加HTTP要求標頭x-fc-async-delay
,其取值範圍為[0,3600],單位為秒。Function Compute將從您觸發執行開始計算,延遲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)
}
}
重要
通過上述操作實現的延遲調用在某些情境下存在一定誤差,如果您需要更加精準的延遲調用函數,請使用定時觸發器。具體資訊,請參見定時觸發器。
常見功能
非同步呼叫的常見功能如下所示: