1. 程式人生 > 其它 >函式計算 HTTP 觸發器支援非同步,解放雙手搭建 Web 服務

函式計算 HTTP 觸發器支援非同步,解放雙手搭建 Web 服務

簡介:函式計算 HTTP 觸發器支援非同步呼叫,為使用者搭建 WEB 服務使用函式計算作為全託管平臺打通了最後一公里,以後 HTTP 觸發器的使用者,也可以感受到非同步呼叫”開箱即用“的便捷體驗。

作者| 阿里雲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 在控制檯進行執行結果日誌的查詢:

對於開通非同步任務的請求,可以通過非同步任務列表進行狀態監測和查詢:

對於非同步執行結果的回撥可以參考函式回撥文件:

結果回撥 - 函式計算 - 阿里雲

最佳實踐

此處以 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 增加處理邏輯,作為轉碼函式執行結果的回撥函式,感知和獲取函式執行結果。

函式回撥相關文件:

結果回撥 - 函式計算 - 阿里雲

總結

HTTP 觸發支援非同步呼叫,為使用者搭建 WEB 服務使用函式計算作為全託管平臺打通了最後一公里,讓 HTTP 觸發器的使用者也可以一樣感受到非同步呼叫開箱即用的便捷體驗。

原文連結

本文為阿里雲原創內容,未經允許不得轉載。