異步任務可以實時感知業務狀態、控制執行函數,讓您對一些異常情況進行更好的處理,例如報警通知、自動化重試等情況。本文介紹函數計算異步任務的最佳實踐。
背景信息
FaaS早期主要支持無狀態、短時和輕量級的計算能力,例如API后端、圖片處理和數據流式處理等。在各類場景中,對于FaaS函數的調用方式可分為異步調用和同步調用。同步調用和異步調用存在的差異是同步調用會立即執行函數,而異步調用則會立刻返回調用方202 HttpCode
,并將異步調用消息入隊,由后端服務排隊處理。
使用場景
隨著業務的發展,一些在線直播場景的用戶在慢慢遷移至FaaS內,這類業務場景通常具有執行時間長、對延時敏感和可用性要求高等特征,開發人員需實時感知業務狀態和控制函數的執行。由于異步調用對延時不敏感,同步調用長鏈接的穩定性比較差,并且占用客戶端資源,所以既無法使用異步調用也無法使用同步調用。但由于異步調用在大量突增流量的離線業務下,具有削峰填谷的特點,可以平滑緩沖對業務下游系統的沖擊,所以函數計算對異步調用進行相關拓展,引入異步任務。異步任務主要適用于以下業務場景:
對執行具有可觀測性
在執行過程中您可以實時查看執行的狀態,例如是否已出隊、是否已觸發函數執行和執行結果是否已正常發送到
Destination
目標。業務具有明顯的任務屬性,如下所示:
可以查看某個執行的觸發事件和實時的執行日志。
可以根據執行的名稱、執行的時間或執行的狀態等過濾查詢歷史記錄。
對執行具有可操作性
業務具有明顯的任務屬性,如下所示:
當執行時間較長時,在某些情況下可以手動停止執行函數。
可以重新執行歷史失敗或成功的執行。
關于異步任務的詳細信息,請參見功能概覽。
示例
本文以異步調用目標輕量消息隊列(原 MNS)為例,介紹如何結合使用Serverless Devs和函數計算控制臺實現異步調用。
您可以通過異步任務實現以下效果:
函數開始異步執行后,您可以通過函數計算控制臺、SDK或API查看操作執行。
當函數執行失敗或手動停止后,函數計算系統會將異步消息推送至輕量消息隊列(原 MNS)的隊列中實現死信隊列的功能,方便您感知異步函數執行失敗的消息并進行后續處理。
前提條件
創建輕量消息隊列(原 MNS)隊列。詳細信息,請參見創建隊列。
創建RAM角色,并授予以下權限策略,您也可以直接使用AliyunFCDefaultRolePolicy策略。關于權限策略的詳細信息,請參見創建RAM角色。
{ "Version": "1", "Statement": [ { "Action": [ "fc:InvokeFunction", "mns:SendMessage", "mns:PublishMessage", "log:*" ], "Resource": "*", "Effect": "Allow" } ] }
操作步驟
執行以下命令,克隆項目工程。
git clone https://github.com/awesome-fc/Stateful-Async-Invocation.git
執行以下命令,進入項目目錄。
cd Stateful-Async-Invocation
修改s.yaml文件。
修改第一個
{please_replace_me}
為您的阿里云賬號ID,修改后兩個{please_replace_me}
的值為您配置的異步調用目標輕量消息隊列(原 MNS)的隊列名稱。在目標目錄中執行以下命令部署函數。
s deploy -y
部署成功后,您可以登錄函數計算控制臺,查看是否成功創建服務和函數并為該函數開啟異步任務功能。
更多信息
異步配置僅在異步調用時才會成功生效。您可以通過SDK或CLI工具發送異步調用請求。
本示例中您可以在示例工程的目標目錄中執行以下命令發送異步觸發請求,并查看輕量消息隊列(原 MNS)。
s invoke --invocation-type async -e '{"failure":true}'
您可以在函數計算控制臺查看、操作異步調用。更多信息,請參見任務管理。
說明如果您需要查看詳細信息例如函數日志,您需要為函數配置日志服務。詳細信息,請參見配置日志。
當函數執行完成后,如已配置了Destination目標,則可前往目標查看推送記錄。
本文示例中,如果配置了Destination目標,您可以在輕量消息隊列(原 MNS)控制臺接收Destination推送的信息,如下所示。
{ "timestamp":xxxx, "requestContext":{ "requestId":"xxxx", "functionArn":"acs:fc:::services/Stateful-Invocation-demo.LATEST/functions/main", "condition":"UnhandledInvocationError", "approximateInvokeCount":1 }, "requestPayload":"{\"failure\":true}", "responseContext":{ "statusCode":200, "functionError":"UnhandledInvocationError" }, "responsePayload":"{\"errorMessage\":\"Process exited unexpectedly before completing request (duration: 13689ms, maxMemoryUsage: 10.86MB)\"}" }
說明當異步調用失敗或手動終止后,您可以在輕量消息隊列(原 MNS)中接收到異步調用時間的詳細錯誤信息。