當您對函數發起非同步呼叫時,如果需要追蹤並儲存非同步呼叫各個階段的狀態,實現更豐富的任務控制和可觀測能力,可以選擇開啟任務模式處理非同步請求。本文介紹非同步任務的背景資訊、使用限制和常用功能。
背景資訊
開啟非同步任務後,您可以實現以下功能:
每次函數調用將詳細記錄調用過程中的狀態轉換資訊,例如排隊等待處理中(Enqueued)、調用執行成功(Succeeded)和調用執行失敗(Failed)等。
擁有函數請求生命週期管理能力,可以主動終止執行中的非同步任務。
非同步任務會儲存狀態資訊,因此,函數的調用和執行會有一定的額外延遲,該延遲不會產生額外的費用。關於Function Compute計費的詳細資料,請參見計費概述。
使用限制
情境限制
非同步任務雖然功能更豐富,但相應的系統開銷更大。以下情境建議您關閉任務模式:
您對請求處理鏈路延時非常敏感,需要平均延時在百毫秒以下。
您需要每秒數千甚至更高的速率發起非同步呼叫。
地區限制
非同步任務支援華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北3(張家口)、華北6(烏蘭察布)、華南1(深圳)、西南1(成都)、中國香港、新加坡、英國(倫敦)、美國(矽谷)、美國(維吉尼亞)、德國(法蘭克福)、馬來西亞(吉隆坡)、印尼(雅加達)、泰國(曼穀)、日本(東京)和韓國(首爾)地區。
時效限制
僅支援查詢7天內的任務狀態資訊。
非同步任務與Jobs功能對比
如果您需要執行非同步任務,您可以使用Function Compute非同步任務功能,也可以使用Kubernetes的Jobs功能來實現。Function Compute非同步任務提供開箱即用的更高效、更可控並且更易於觀測的非同步任務執行平台。以下是詳細功能對比。
對比項 | Function Compute非同步任務 | Kubernetes的Jobs功能 |
適用情境 | 適用於任務執行時間長度數十毫秒的即時任務和任務執行時間長度數十小時的離線任務。 | 適用於任務提交速度要求不高,任務負載比較固定,任務即時性要求不高的離線任務。 |
任務可觀測能力 | 支援。提供日誌、任務排隊數等指標和任務鏈路耗時、任務狀態查詢等豐富的可觀測能力。 | 需自行整合開源軟體來實現。 |
任務執行個體自動擴縮容 | 支援。根據任務排隊數和執行個體資源使用率自動擴縮容。 | 需通過任務隊列自行實現擴縮容和執行個體負載平衡,複雜度較高。 |
任務執行個體伸縮速度 | 毫秒級。 | 分鐘級。 |
任務執行個體資源使用率 | 使用者只需要選擇合適的執行個體規格,執行個體自動調整,按實際處理任務的時間長度計量,資源使用率高。 | 需在Jobs提交時確定執行個體的規格和數目。執行個體難以自動調整和負載平衡,資源使用率低。 |
任務提交速度 | 單個使用者支援每秒提交數萬條任務。 | 整個叢集每秒最多啟動數百條Jobs。 |
任務定時或延時提交 | 支援。 | 支援任務定時提交,不支援任務延時提交。 |
任務去重 | 支援。 | 不支援。 |
終止指定任務 | 支援。 | 有限支援。通過終止任務執行個體間接實現。 |
任務流控 | 支援。可在使用者或任務處理函數等不同粒度進行流控。 | 不支援。 |
任務結果自動回調 | 支援。 | 不支援。 |
開發營運成本 | 只需要實現任務的處理邏輯。 | 需維護K8s叢集。 |
任務管理
非同步任務的狀態
針對每一次任務調用,Function Compute均會記錄任務的狀態變更過程,並提供即時的狀態查詢能力。您可以通過SDK或Function Compute控制台查看任務的具體狀態。目前任務有如下幾種狀態:
執行狀態 | 說明 |
已入隊 | 非同步訊息已入隊,等待處理。 |
已處理 | 非同步訊息已出隊,等待觸發。 |
執行中 | 調用執行中,您的執行個體已經開始運行任務代碼。 |
執行成功 | 調用執行成功。 |
執行失敗 | 調用執行失敗。 |
已停止 | 您已手動停止該次任務調用。任務已成功終止。 |
停止中 | 您手動停止了該次任務,任務嘗試停止中。 |
已到期 | 您給非同步訊息配置了存活有效期間,該訊息因到期已被丟棄(未觸發)。 |
無效 | 您的執行因函數或服務被刪除等原因處於無效狀態(未觸發)。 |
重試中 | 非同步呼叫因執行錯誤而進行重試中。當系統準備好重試後,您的任務將會再次變為Running狀態。 |
您可以調用GetAsyncTask - 擷取非同步任務介面擷取某次任務執行的詳細資料,也可以調用ListAsyncTasks - 擷取非同步工作清單介面過濾指定狀態的任務。
管理工作
通過控制台管理工作
建立函數的同時開啟非同步任務
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊建立函數。
在彈出的對話方塊,選擇任務函數,單擊建立任務函數,在建立任務函數頁面,設定函數名稱,然後單擊建立。
關於各配置項的說明,請參見建立任務函數。
函數建立成功後,在函數詳情頁的任務頁簽,您可以看到任務模式已經預設開啟。
為已有函數開啟非同步任務模式
需要先建立函數,具體操作,請參見建立函數。
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在函數詳情頁面,選擇任務頁簽,單擊任務模式右側的編輯。
在任務模式面板,任務模式選擇開啟後單擊部署。
啟動或停止任務
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在函數詳情頁面,選擇任務頁簽,單擊提交任務,在彈出的對話方塊,選擇任務ID產生方式和任務執行時間,然後單擊確定。
您也可以單擊提交任務右側的
表徵圖,從下拉式清單中選擇配置測試參數,事件函數將以event的形式,HTTP函數將以HTTP參數的形式輸入參數傳遞給函數,類比提交任務。您可以在下方工作清單查看任務狀態、任務ID、執行個體ID或者登入執行個體等。
調用API(SDK)管理工作
配置任務模式
調用PutAsyncInvokeConfig - 設定函數非同步配置介面,配置非同步呼叫模式為任務模式。將asyncTask配置為如下內容,完成該配置後,該函數的所有非同步呼叫將變為任務模式。
{
"asyncTask": true
}您配置非同步呼叫模式為任務模式後,仍然可以使用同步方式調用函數,但非同步任務模式只針對非同步呼叫生效。
通過非同步呼叫觸發函數
您可以通過調用InvokeFunction - 調用函數介面,x-fc-invocation-type參數選擇Async,觸發一次非同步呼叫來啟動任務模式。您可以在調用時添加HTTP要求標頭x-fc-async-task-id來為本次調用設定任務ID,更多資訊,請參見任務防重複提交。
查看任務
您提交任務後,如需查詢某次執行的狀態或執行記錄等資訊,您可以調用GetAsyncTask - 擷取非同步任務介面進行查詢。
如果您需要根據關鍵字或條件查詢合格任務執行列表,您可以調用ListAsyncTasks - 擷取非同步工作清單介面來實現。
停止任務
您提交任務後,可根據需要停止任務。您可以調用StopAsyncTask - 停止非同步任務介面執行停止任務操作。停止任務時需要提供TaskID,此ID為您提交任務時設定的TaskID,也可以是調用ListAsyncTasks - 擷取非同步工作清單介面查詢運行中任務時,擷取的ID。
事件觸發
您可以通過建立支援非同步呼叫的觸發器來觸發非同步任務,支援非同步呼叫的觸發器列表如下。
通過事件匯流排EventBridge實現的觸發器,包括以下幾種:
重要請確保HTTP和通過事件匯流排EventBridge實現的觸發器的調用方式為非同步呼叫。
任務防重複提交
為了避免任務重複執行,Function Compute支援為每次提交的任務設定全域唯一的ID,當非同步介面提交失敗時,例如非同步呼叫提交任務介面逾時,您可以通過提交相同ID的任務進行重試。關於重試方式的介紹,請參見重試策略。
Function Compute提供TaskID這一任務概念,該ID全域唯一。建議您在每次提交任務時指定該ID,並在出現逾時等情況下進行重試。Function Compute會對您重複提交的任務進行校正,當有相同ID進入系統時,該次請求將認為是重複提交而被拒絕,並返回錯誤409。
Function Compute還提供了RequestID這一概念,如果您設定了RequestID但未設定TaskID,系統將自動化佈建TaskID為RequestID。使用非同步任務時,建議您設定TaskID,無需設定RequestID。
設定TaskID
您可以在Function Compute控制台、使用Serverless Devs或調用API提交一次任務執行。如果需要設定TaskID,請在觸發函數執行時設定參數x-fc-async-task-id。
觸發任務執行時設定TaskID的範例程式碼請參見範例程式碼。
任務監控
您可以使用Function Compute提供的任務監控指標即時擷取非同步任務的狀態、及時發現錯誤和逾時等異常資訊。
前提條件
已建立函數,詳情請參見建立函數。
操作步驟
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在目標函數的詳情頁面,選擇監控頁簽,查看非同步呼叫相關指標和非同步任務執行個體層級的資源使用方式。關於監控指標的詳細介紹,請參見監控指標。
單擊函數指標頁簽,查看非同步呼叫相關指標資訊,如非同步呼叫處理情況、非同步訊息處理延時、非同步呼叫觸發事件和非同步請求積壓數等。
單擊執行個體指標頁簽,查看非同步任務執行個體層級的資源使用方式。
說明開通執行個體層級指標前,需先開通日誌功能。具體操作,請參見配置日誌。
為指標設定警示規則。
如果您想監控某個指標,如記憶體使用量情況、vCPU使用方式等,可以單擊指標右上方的
,跳轉到建立指標警示規則面板,根據介面提示設定警示條件和閾值,然後單擊確定。關於警示規則的設定,請參見下圖。下圖中參數設定值表示當函數非同步呼叫積壓數大於等於5條時,將全天候通過DingTalk、郵件、電話和Webhook的方式上報中級警示到連絡人。

任務編排
結合CloudFlow,函數的非同步呼叫可以應用於大規模複雜情境的任務流程。您可以使用傳遞(Pass)、迭代(Map)和並行(Parallel)等方式來編排Function Compute非同步任務,CloudFlow會按照設定好的步驟可靠地協調任務執行,跟蹤每個任務的狀態轉換,並在必要時執行您定義的重試邏輯,以確保任務順利完成。更多資訊,請參見整合Function Compute。
前提條件
建立非同步任務。具體操作,請參見任務管理。
授予Function Compute訪問Serverless 工作流程的許可權。具體操作,請參見使用函數角色授予Function Compute訪問其他雲端服務的許可權。
操作步驟
登入雲工作流程控制台,然後在頂部功能表列,選擇地區。
在左側導覽列,選擇工作流程列表,然後在工作流程列表頁面,單擊建立工作流程。
在建立工作流程對話方塊,選擇建立工作流程的方式,然後選擇要建立的工作流程的模式。
CloudFlow支援建立標準和快速兩種模式的工作流程,關於兩種模式的更多資訊,請參見標準工作流程和快速工作流程。更多操作,請參見基於空白畫布建立工作流程。
編輯上一步建立的工作流程。
編輯流程。
您可以選擇CloudFlow Studio編輯或YAML編輯兩種方式,本文以YAML編輯方式為例進行介紹。
在流程詳情頁面右上方,單擊YAML,在左側代碼編輯框內輸入資料流程定義語言,然後單擊儲存。
樣本如下。
Type: StateMachine Name: MyFlow SpecVersion: v1 StartAt: InvokeFunction States: - Type: Task Name: InvokeFunction Action: FC:InvokeFunction TaskMode: RequestComplete Parameters: invocationType: Async resourceArn: acs:fc:us-west-1:103435468****:functions/func-i1****/LATEST End: true配置流程角色。
在流程詳情頁面右上方,單擊工作流程配置,選擇執行角色,然後單擊儲存。
說明請確保為流程配置的角色已被授予AliyunFCInvocationAccess權限原則。
在流程詳情頁面,您可以單擊右上方的執行觸發工作流程工作進行測試。