異步任務(wù)
當您對函數(shù)發(fā)起異步調(diào)用時,如果需要追蹤并保存異步調(diào)用各個階段的狀態(tài),實現(xiàn)更豐富的任務(wù)控制和可觀測能力,可以選擇開啟任務(wù)模式處理異步請求。本文介紹異步任務(wù)的背景信息、使用限制和常用功能。
背景信息
開啟異步任務(wù)后,您可以實現(xiàn)以下功能:
每次函數(shù)調(diào)用將詳細記錄調(diào)用過程中的狀態(tài)轉(zhuǎn)換信息,例如排隊等待處理中(Enqueued)、調(diào)用執(zhí)行成功(Succeeded)和調(diào)用執(zhí)行失敗(Failed)等。
擁有函數(shù)請求生命周期管理能力,可以主動終止執(zhí)行中的異步任務(wù)。
異步任務(wù)會保存狀態(tài)信息,因此,函數(shù)的調(diào)用和執(zhí)行會有一定的額外延遲,該延遲不會產(chǎn)生額外的費用。關(guān)于函數(shù)計算計費的詳細信息,請參見計費概述。
使用限制
場景限制
異步任務(wù)雖然功能更豐富,但相應(yīng)的系統(tǒng)開銷更大。以下場景建議您關(guān)閉任務(wù)模式:
您對請求處理鏈路延時非常敏感,需要平均延時在百毫秒以下。
您需要每秒數(shù)千甚至更高的速率發(fā)起異步調(diào)用。
地域限制
異步任務(wù)支持華東1(杭州)、華東2(上海)、華北1(青島)、華北2(北京)、華北3(張家口)、華南1(深圳)、西南1(成都)、中國香港、新加坡、英國(倫敦)、美國(硅谷)、美國(弗吉尼亞)、德國(法蘭克福)、馬來西亞(吉隆坡)、印度尼西亞(雅加達)、泰國(曼谷)、日本(東京)和韓國(首爾)地域。
時效限制
僅支持查詢7天內(nèi)的任務(wù)狀態(tài)信息。
異步任務(wù)與Jobs功能對比
如果您需要執(zhí)行異步任務(wù),您可以使用函數(shù)計算異步任務(wù)功能,也可以使用Kubernetes的Jobs功能來實現(xiàn)。函數(shù)計算異步任務(wù)提供開箱即用的更高效、更可控并且更易于觀測的異步任務(wù)執(zhí)行平臺。以下是詳細功能對比。
對比項 | 函數(shù)計算異步任務(wù) | Kubernetes的Jobs功能 |
適用場景 | 適用于任務(wù)執(zhí)行時長數(shù)十毫秒的實時任務(wù)和任務(wù)執(zhí)行時長數(shù)十小時的離線任務(wù)。 | 適用于任務(wù)提交速度要求不高,任務(wù)負載比較固定,任務(wù)實時性要求不高的離線任務(wù)。 |
任務(wù)可觀測能力 | 支持。提供日志、任務(wù)排隊數(shù)等指標和任務(wù)鏈路耗時、任務(wù)狀態(tài)查詢等豐富的可觀測能力。 | 需自行整合開源軟件來實現(xiàn)。 |
任務(wù)實例自動擴縮容 | 支持。根據(jù)任務(wù)排隊數(shù)和實例資源使用率自動擴縮容。 | 需通過任務(wù)隊列自行實現(xiàn)擴縮容和實例負載均衡,復(fù)雜度較高。 |
任務(wù)實例伸縮速度 | 毫秒級。 | 分鐘級。 |
任務(wù)實例資源利用率 | 用戶只需要選擇合適的實例規(guī)格,實例自動伸縮,按實際處理任務(wù)的時長計量,資源利用率高。 | 需在Jobs提交時確定實例的規(guī)格和數(shù)目。實例難以自動伸縮和負載均衡,資源利用率低。 |
任務(wù)提交速度 | 單個用戶支持每秒提交數(shù)萬條任務(wù)。 | 整個集群每秒最多啟動數(shù)百條Jobs。 |
任務(wù)定時或延時提交 | 支持。 | 支持任務(wù)定時提交,不支持任務(wù)延時提交。 |
任務(wù)去重 | 支持。 | 不支持。 |
終止指定任務(wù) | 支持。 | 有限支持。通過終止任務(wù)實例間接實現(xiàn)。 |
任務(wù)流控 | 支持。可在用戶或任務(wù)處理函數(shù)等不同粒度進行流控。 | 不支持。 |
任務(wù)結(jié)果自動回調(diào) | 支持。 | 不支持。 |
開發(fā)運維成本 | 只需要實現(xiàn)任務(wù)的處理邏輯。 | 需維護K8s集群。 |
任務(wù)管理
異步任務(wù)的狀態(tài)
針對每一次任務(wù)調(diào)用,函數(shù)計算均會記錄任務(wù)的狀態(tài)變更過程,并提供實時的狀態(tài)查詢能力。您可以通過SDK或函數(shù)計算控制臺查看任務(wù)的具體狀態(tài)。目前任務(wù)有如下幾種狀態(tài):
執(zhí)行狀態(tài) | 說明 |
已入隊 | 異步消息已入隊,等待處理。 |
已處理 | 異步消息已出隊,等待觸發(fā)。 |
執(zhí)行中 | 調(diào)用執(zhí)行中,您的實例已經(jīng)開始運行任務(wù)代碼。 |
執(zhí)行成功 | 調(diào)用執(zhí)行成功。 |
執(zhí)行失敗 | 調(diào)用執(zhí)行失敗。 |
已停止 | 您已手動停止該次任務(wù)調(diào)用。任務(wù)已成功終止。 |
停止中 | 您手動停止了該次任務(wù),任務(wù)嘗試停止中。 |
已過期 | 您給異步消息配置了存活有效期,該消息因過期已被丟棄(未觸發(fā))。 |
無效 | 您的執(zhí)行因函數(shù)或服務(wù)被刪除等原因處于無效狀態(tài)(未觸發(fā))。 |
重試中 | 異步調(diào)用因執(zhí)行錯誤而進行重試中。當系統(tǒng)準備好重試后,您的任務(wù)將會再次變?yōu)?span data-tag="parmname" id="parmname-teb-zue-kpy" class="parmname">Running狀態(tài)。 |
您可以調(diào)用GetAsyncTask - 獲取異步任務(wù)接口獲取某次任務(wù)執(zhí)行的詳細信息,也可以調(diào)用ListAsyncTasks - 獲取異步任務(wù)列表接口過濾指定狀態(tài)的任務(wù)。
管理任務(wù)
通過控制臺管理任務(wù)
創(chuàng)建函數(shù)的同時開啟異步任務(wù)
登錄函數(shù)計算控制臺,在左側(cè)導(dǎo)航欄,單擊函數(shù)。
在頂部菜單欄,選擇地域,然后在函數(shù)頁面,單擊創(chuàng)建函數(shù)。
在創(chuàng)建函數(shù)頁面,選擇任務(wù)函數(shù),根據(jù)實際需求設(shè)置配置項,然后單擊創(chuàng)建。
關(guān)于各配置項的說明,請參見創(chuàng)建任務(wù)函數(shù)。
函數(shù)創(chuàng)建成功后,在函數(shù)詳情頁的配置頁簽的異步配置區(qū)域,您可以看到任務(wù)模式已經(jīng)默認被開啟。
為已有函數(shù)開啟異步任務(wù)模式
需要先創(chuàng)建函數(shù),具體操作,請參見創(chuàng)建函數(shù)。
登錄函數(shù)計算控制臺,在左側(cè)導(dǎo)航欄,單擊函數(shù)。
在頂部菜單欄,選擇地域,然后在函數(shù)頁面,單擊目標函數(shù)。
在函數(shù)詳情頁面,選擇配置頁簽,然后在左側(cè)選擇異步配置。
在異步配置頁面的異步配置區(qū)域,單擊編輯,然后在異步配置面板,任務(wù)模式選擇開啟后單擊部署。
啟動或停止任務(wù)
登錄函數(shù)計算控制臺,在左側(cè)導(dǎo)航欄,單擊函數(shù)。
在頂部菜單欄,選擇地域,然后在函數(shù)頁面,單擊目標函數(shù)。
在函數(shù)詳情頁面,選擇任務(wù)頁簽,單擊提交任務(wù),在彈出的對話框,選擇任務(wù)ID生成方式和任務(wù)執(zhí)行時間,然后單擊確定。
您也可以單擊提交任務(wù)右側(cè)的圖標,從下拉列表中選擇配置測試參數(shù),事件函數(shù)將以event的形式,HTTP函數(shù)將以HTTP參數(shù)的形式輸入?yún)?shù)傳遞給函數(shù),模擬提交任務(wù)。
您可以在下方任務(wù)列表查看任務(wù)狀態(tài)、任務(wù)詳情以及請求ID、實例ID或者登錄實例等。
調(diào)用API(SDK)管理任務(wù)
配置任務(wù)模式
調(diào)用PutAsyncInvokeConfig - 設(shè)置函數(shù)異步配置接口,配置異步調(diào)用模式為任務(wù)模式。將asyncTask配置為如下內(nèi)容,完成該配置后,該函數(shù)的所有異步調(diào)用將變?yōu)槿蝿?wù)模式。
{
"asyncTask": true
}
您配置異步調(diào)用模式為任務(wù)模式后,仍然可以使用同步方式調(diào)用函數(shù),但異步任務(wù)模式只針對異步調(diào)用生效。
通過異步調(diào)用觸發(fā)函數(shù)
您可以通過調(diào)用InvokeFunction - 調(diào)用函數(shù)接口,x-fc-invocation-type參數(shù)選擇Async,觸發(fā)一次異步調(diào)用來啟動任務(wù)模式。您可以在調(diào)用時添加HTTP請求頭x-fc-async-task-id來為本次調(diào)用設(shè)置任務(wù)ID,更多信息,請參見任務(wù)防重復(fù)提交。
查看任務(wù)
您提交任務(wù)后,如需查詢某次執(zhí)行的狀態(tài)或執(zhí)行記錄等信息,您可以調(diào)用GetAsyncTask - 獲取異步任務(wù)接口進行查詢。
如果您需要根據(jù)關(guān)鍵字或條件查詢符合條件的任務(wù)執(zhí)行列表,您可以調(diào)用ListAsyncTasks - 獲取異步任務(wù)列表接口來實現(xiàn)。
停止任務(wù)
您提交任務(wù)后,可根據(jù)需要停止任務(wù)。您可以調(diào)用StopAsyncTask - 停止異步任務(wù)接口執(zhí)行停止任務(wù)操作。停止任務(wù)時需要提供TaskID,此ID為您提交任務(wù)時設(shè)置的TaskID,也可以是調(diào)用ListAsyncTasks - 獲取異步任務(wù)列表接口查詢運行中任務(wù)時,獲取的ID。
事件觸發(fā)
您可以通過創(chuàng)建支持異步調(diào)用的觸發(fā)器來觸發(fā)異步任務(wù),支持異步調(diào)用的觸發(fā)器列表如下。
通過事件總線EventBridge實現(xiàn)的觸發(fā)器,包括以下幾種:
重要請確保HTTP和通過事件總線EventBridge實現(xiàn)的觸發(fā)器的調(diào)用方式為異步調(diào)用。
任務(wù)防重復(fù)提交
為了避免任務(wù)重復(fù)執(zhí)行,函數(shù)計算支持為每次提交的任務(wù)設(shè)定全局唯一的ID,當異步接口提交失敗時,例如異步調(diào)用提交任務(wù)接口超時,您可以通過提交相同ID的任務(wù)進行重試。關(guān)于重試方式的介紹,請參見重試策略。
函數(shù)計算提供TaskID這一任務(wù)概念,該ID全局唯一。建議您在每次提交任務(wù)時指定該ID,并在出現(xiàn)超時等情況下進行重試。函數(shù)計算會對您重復(fù)提交的任務(wù)進行校驗,當有相同ID進入系統(tǒng)時,該次請求將認為是重復(fù)提交而被拒絕,并返回錯誤409
。
函數(shù)計算還提供了RequestID這一概念,如果您設(shè)置了RequestID但未設(shè)置TaskID,系統(tǒng)將自動設(shè)置TaskID為RequestID。使用異步任務(wù)時,建議您設(shè)置TaskID,無需設(shè)置RequestID。
設(shè)置TaskID
您可以在函數(shù)計算控制臺、使用Serverless Devs或調(diào)用API提交一次任務(wù)執(zhí)行。如果需要設(shè)置TaskID,請在觸發(fā)函數(shù)執(zhí)行時設(shè)置參數(shù)x-fc-async-task-id。
觸發(fā)任務(wù)執(zhí)行時設(shè)置TaskID的示例代碼請參見示例代碼。
任務(wù)監(jiān)控
您可以使用函數(shù)計算提供的任務(wù)監(jiān)控指標實時獲取異步任務(wù)的狀態(tài)、及時發(fā)現(xiàn)錯誤和超時等異常信息。
前提條件
已創(chuàng)建函數(shù),詳情請參見創(chuàng)建函數(shù)。
操作步驟
登錄函數(shù)計算控制臺,在左側(cè)導(dǎo)航欄,單擊函數(shù)。
在頂部菜單欄,選擇地域,然后在函數(shù)頁面,單擊目標函數(shù)。
在目標函數(shù)的詳情頁面,選擇監(jiān)控頁簽,查看異步調(diào)用相關(guān)指標和異步任務(wù)實例級別的資源使用情況。關(guān)于監(jiān)控指標的詳細介紹,請參見監(jiān)控指標。
單擊函數(shù)指標頁簽,查看異步調(diào)用相關(guān)指標信息,如下圖所示。
單擊實例指標頁簽,查看異步任務(wù)實例級別的資源使用情況,如下圖所示。
說明開通實例級別指標前,需先開通日志功能。具體操作,請參見配置日志。
為指標設(shè)定告警規(guī)則。
如果您想監(jiān)控某個指標,如內(nèi)存使用情況、vCPU使用情況等,可以單擊指標右上角的,跳轉(zhuǎn)到創(chuàng)建指標告警規(guī)則面板,根據(jù)界面提示設(shè)置告警條件和閾值,然后單擊確定。
關(guān)于告警規(guī)則的設(shè)置,請參見下圖。下圖中參數(shù)設(shè)置值表示當函數(shù)異步調(diào)用積壓數(shù)大于等于5條時,將全天候通過釘釘、郵件、電話和Webhook的方式上報中級告警到聯(lián)系人。
任務(wù)編排
結(jié)合云工作流,函數(shù)的異步調(diào)用可以應(yīng)用于大規(guī)模復(fù)雜場景的任務(wù)流程。您可以使用順序、分支和并行等方式來編排函數(shù)計算異步任務(wù),云工作流會按照設(shè)定好的步驟可靠地協(xié)調(diào)任務(wù)執(zhí)行,跟蹤每個任務(wù)的狀態(tài)轉(zhuǎn)換,并在必要時執(zhí)行您定義的重試邏輯,以確保任務(wù)順利完成。更多信息,請參見集成函數(shù)計算。
前提條件
創(chuàng)建異步任務(wù)。具體操作,請參見任務(wù)管理。
授予函數(shù)計算訪問Serverless 工作流的權(quán)限。具體操作,請參見授予函數(shù)計算訪問其他云服務(wù)的權(quán)限。
操作步驟
登錄云工作流控制臺,然后在頂部菜單欄,選擇地域。
在左側(cè)導(dǎo)航欄,選擇工作流列表,然后在工作流列表頁面,單擊創(chuàng)建工作流。
在創(chuàng)建工作流對話框,選擇創(chuàng)建工作流的方式,然后選擇要創(chuàng)建的工作流的模式。
云工作流支持創(chuàng)建標準和快速兩種模式的工作流,關(guān)于兩種模式的更多信息,請參見標準工作流和快速工作流。更多操作,請參見基于空白畫布創(chuàng)建工作流。
編輯上一步創(chuàng)建的工作流。
編輯流程。
您可以選擇CloudFlow Studio編輯或YAML編輯兩種方式,本文以YAML編輯方式為例進行介紹。
在流程詳情頁面右上角,單擊YAML,在左側(cè)代碼編輯框內(nèi)輸入流程定義語言,然后單擊保存。
示例如下。
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
配置流程角色。
在流程詳情頁面右上角,單擊工作流配置,選擇執(zhí)行角色,然后單擊保存。
說明請確保為流程配置的角色已被授予AliyunFCInvocationAccess權(quán)限策略。
在流程詳情頁面,您可以單擊右上角的執(zhí)行觸發(fā)工作流任務(wù)進行測試。