
作者| 阿裡雲Serverless技術專家 澈爾
目前阿裡雲函數計算支援兩種類型的函數:事件函數和 HTTP 函數。其中 HTTP 函數結合 HTTP 觸發器,能夠支援使用者直接通過 HTTP 請求利用 Restful API 的方式發起函數調用;通過這種方式,使用者無需內建函數計算提供的 SDK 就能實作函數調用,更好地同已有系統的元件及 WEB 服務進行內建。
考慮到 HTTP 函數最初設計的目的,面向 Web 場景,HTTP 函數并未支援異步調用,随着使用者使用 HTTP 函數的場景增加,HTTP 函數無法支援異步調用的限制,對于使用者更廣泛的使用 HTTP 函數帶來了諸多的限制。
不支援異步調用,使用者有多難?
目前,已經有很多客戶咋使用函數計算 HTTP 觸發器搭建 WEB 服務,其中很多人有通過 WEB 服務進行檔案(視訊、圖檔等)處理轉碼,投遞任務,進行壓測的需求。這些需求則往往具有長執行,流量不均勻等特性。具有這些特征的函數在同步執行的場景下有以下缺點:
長執行函數增加函數錯誤的風險,提升機器開銷。
- 用戶端需要保持長連結,網絡波動、客戶由于函數執行耗時較長失去耐心自主斷開連接配接等,都增加了函數錯誤發生的幾率。
- 場景:視訊網站使用者上傳視訊轉碼,耗時長重新整理頁面導緻連接配接中斷,轉碼失敗。
- 保持長連結增加了用戶端的機器開銷,降低了用戶端機器資源的使用率。
面對突增流量無法平滑處理和接收。
- 對于有并發限制的場景,客戶的突增流量在同步調用的場景下會被限流,進而在客戶不做錯誤處理的時候造成一定請求失敗。
- 場景1:脈沖式壓測場景。
- 場景2:限時線上促銷活動。
在這些場景下,客戶可以通過異步調用将 HTTP 觸發和函數執行進行解耦,提升執行效率和執行成功率,降低開銷。異步調用 at least once 的保證, 目标投遞的能力,以及具有可觀測性和可管控能力的異步任務模式能更好地讓客戶享受到函數托管服務的便利,解放客戶雙手。
HTTP 觸發器不支援異步調用時,為了滿足需求,客戶往往需要通過函數轉跳的方式間接實作 HTTP 觸發異步調用。具體流程如下:
客戶可以建立兩個函數,函數 A 為 HTTP 函數,通過 HTTP 同步調用,函數 B 為事件函數,可以由 HTTP 函數通過 SDK 進行異步調用。但是該方案的缺點也很明顯:
- 成本高:每次異步調用都需要兩次觸發。
- 無法實作流控全托管:第一層函數為同步調用,面對突增流量被流控,需要客戶自行做自适應,進而無法享受異步調用的流控全托管。
- 增加客戶開發維護成本:需要開發和維護兩個函數來使用異步功能。
新功能:HTTP 觸發器支援異步調用
函數計算目前上線支援了 HTTP 觸發器進行異步調用的功能。使用本功能,客戶需要準備好一個 HTTP 函數和一個 HTTP 觸發器。
客戶可以通過函數計算控制台、SDK和Serverless Devs 工具來進行 HTTP 函數和觸發器的建立。HTTP 觸發器客戶可以自行配置,如果不進行配置,在建立 HTTP 函數的時候,函數計算會為您自動建立一個預設觸發器。
HTTP 觸發器需要通過請求頭X-Fc-Invocation-Type來選擇觸發方式,預設為同步觸發,如果需要進行異步觸發,則可以在請求頭中添加 _{"X-Fc-Invocation-Type":"Async"} _進而實作異步觸發。
HTTP 異步調用測試
- 通過控制台進行測試
在函數代碼處進行測試,通過勾選異步調用進行異步調用測試。
在測試函數側可以通過勾選我想通過異步的方式進行調用實作異步調用測試。
curl -v -H "X-Fc-Invocation-Type: Async" https://http-***.cn-shenzhen.fcapp.run/$path
- 通過 cURL 進行測試
- 測試結果檢視
觸發完成後會立即傳回函數計算接收請求的結果。其中狀态碼202表示請求成功,其餘表示請求出現錯誤。請求ID 也會在請求頭中一并傳回,您可以通過傳回的請求 ID 追蹤異步請求的執行狀态。為了更好地觀測請求請求執行狀态,增加對函數執行的管控,您可以開通異步任務。
可以通過請求ID 在控制台進行執行結果日志的查詢:
對于開通異步任務的請求,可以通過異步任務清單進行狀态監測和查詢:
對于異步執行結果的回調可以參考函數回調文檔:https://help.aliyun.com/document_detail/422720.html
最佳實踐
此處以 HTTP 觸發視訊轉碼為例,介紹如何通過結合 Serverless Devs 與控制台,實作 HTTP 觸發異步任務。
前提條件:
- 安裝Serverless Devs
- 配置Serverless Devs
- 建立 OSS 存儲空間,以便後續測試用例中對 OSS 存儲空間進行通路和内容變更。
- 建立RAM角色,并授予 OSSFullAccess 權限政策,您也可以直接使用AliyunFCDefaultRolePolicy政策。關于權限政策的詳細資訊,請參見建立RAM角色。
操作步驟:
1、初始化項目
s init http-video-transcode -d http-video-transcode
2、進入項目并部署
cd http-video-transcode && s deploy
3、通過 HTTP 觸發器發起異步調用
curl -v -H "X-Fc-Invocation-Type: Async" -H "Content-Type: application/json" -d '{"bucket":"my-bucket", "object":"480P.mp4", "output_dir":"a", "dst_format":"mov"}' -X POST https://http-***.cn-shenzhen.fcapp.run/
4、登陸控制台查詢任務狀态,并對任務進行管控
5、函數回調
您可以根據需求在 dest-fail 或 dest-succ 增加處理邏輯,作為轉碼函數執行結果的回調函數,感覺和擷取函數執行結果。
函數回調相關文檔:
https://help.aliyun.com/document_detail/422720.html