全部產品
Search
文件中心

Function Compute:功能概覽

更新時間:Jul 06, 2024

本文介紹非同步呼叫的背景資訊、應用情境以及如何?延遲調用函數等。

背景資訊

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)
    }
}
重要

通過上述操作實現的延遲調用在某些情境下存在一定誤差,如果您需要更加精準的延遲調用函數,請使用定時觸發器。具體資訊,請參見定時觸發器

常見功能

非同步呼叫的常見功能如下所示: