
作者| 阿里云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 進行測驗
curl -v -H "X-Fc-Invocation-Type: Async" https://http-***.cn-shenzhen.fcapp.run/$path
- 測驗結果查看
觸發完成后會立即回傳函式計算接收請求的結果,其中狀態碼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

總結
HTTP 觸發支持異步呼叫,為用戶搭建 WEB 服務使用函式計算作為全托管平臺打通了最后一公里,讓 HTTP 觸發器的使用者也可以一樣感受到異步呼叫開箱即用的便捷體驗,
更多內容關注 Serverless 微信公眾號(ID:serverlessdevs),匯集 Serverless 技術最全內容,定期舉辦 Serverless 活動、直播,用戶最佳實踐,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/469907.html
標籤:其他
