1. 程式人生 > 實用技巧 >騰訊雲 CFS 檔案儲存給雲函式 SCF 帶來的業務新場景

騰訊雲 CFS 檔案儲存給雲函式 SCF 帶來的業務新場景

雲函式 SCF 儲存空間使用背景

目前 Serverless 架構已經在很多場景中落地,無論是使用 API 閘道器 + 雲函式 SCF 實現 API 服務和 Web 服務,還是通過物件儲存 COS 觸發函式執行,進行檔案上傳事件的傳遞和檔案的處理,或者通過訊息佇列中的訊息觸發函式,進行訊息的過濾轉儲;Serverless 依靠其快速開發上線,無需複雜運維的特性,正逐步進入到更多的業務場景中。

在實際的使用過程中,雲函式作為計算形態的產品,提供了計算高度的彈性擴縮容。在雲函式執行時,執行環境中的檔案系統為只讀,在/tmp目錄下提供了 512MB 的臨時儲存空間;臨時儲存空間為單併發例項使用,各併發例項之間不共享;臨時空間在併發例項複用時會保留檔案,業務程式碼如果有寫檔案,需要自行注意清理避免空間寫滿;同時在併發例項長時間未使用銷燬時,臨時空間也會清理。

目前,使用物件儲存 COS 進行雲函式中的檔案相關操作,當用戶需要使用檔案,從物件儲存中下載到本地;在本地完成處理或生成的檔案,在函式執行結束前上傳到物件儲存中持久儲存。很多場景通過使用物件儲存 COS 產品可以解決。由於這種解決方法均需要使用 SDK 來完成物件儲存的檔案操作,從檔案操作的便利性上來說,不如直接的本地檔案操作來的簡單方便。

檔案儲存 CFS 給雲函式提供按需擴充套件的儲存空間

檔案儲存(Cloud File Storage,CFS)產品提供了安全可靠、可擴充套件的共享檔案儲存服務,可以為各種計算類產品提供容量和效能可彈性擴充套件的高效能共享儲存。通過與雲函式產品的對接,CFS 可以提供按需擴充套件的儲存空間,並按實際的使用容量來付費,符合 Serverless 架構的特性。

從 COS 物件儲存和 CFS 檔案儲存的特性對比上,可以看到兩者均提供了充足可擴充套件的儲存空間,均使用按實際使用量的方式進行付費;CFS 由於通常是通過檔案系統掛載的方式使用,因此通常在 VPC 內網中提供服務,而 COS 由於通過 HTTP API 提供服務,因此在內外網中均可以提供服務;使用方式的差異,造成了我們通過程式碼在實際操作檔案時,COS 要依賴 API 或 SDK 來進行檔案相關操作,而 CFS 可以和使用本地檔案系統一樣的方式,通過各種開發語言自帶的標準檔案系統庫來進行操作。

檔案儲存 CFS + 雲函式 SCF 的優勢

通過 CFS 提供的共享檔案儲存服務,可以為雲函式解決在實際使用過程中碰到的儲存方面的問題,並進一步擴充套件雲函式可以支援的使用場景。從功能點上來說,對接 CFS 可以獲得的優勢包括了:

  • 擴充套件儲存空間,函式執行環境內的儲存空間不再受限與 512 MB 的臨時儲存空間。
  • 儲存空間的持久儲存,CFS 提供的儲存空間,不會隨著函式併發例項的銷燬而清理,而是可以持久儲存。
  • 跨併發和跨函式訪問,CFS 的儲存空間,是在函式的併發例項間共享的,而如果將同一個 CFS 儲存空間掛載到多個函式上,儲存空間也可以在多個函式間共享;共享特性可以帶來很多檔案操作的便利性,但是同時也需要注意檔案讀寫的併發特性,在多併發寫同一檔案時注意寫順序或使用寫鎖來互斥。
  • 標準 posix io 介面,使用各個語言自帶的 file system 檔案系統庫即可操作,無需額外的 SDK;而如果需要額外使用一些 SDK、Agent 等,也可以直接進行檔案讀寫。

檔案儲存 CFS 給雲函式帶來的業務新場景

通過 CFS 檔案儲存產品獲得的優勢,可以改善和擴充套件現有云函式所實現的一些場景,也可以帶來很多新的場景。

如上圖所示,在使用雲函式進行物件儲存檔案解壓的場景中,由 COS 物件儲存中的 ZIP 檔案上傳事件觸發函式,函式在獲取到事件後,通過下載 ZIP 檔案,在本地完成解壓並再次上傳到物件儲存中,實現 ZIP 檔案的上傳自動解壓能力。受限於函式的臨時空間 512 MB 的限制,以及原始檔案和解壓後文件均需要放置在臨時空間中,這種時候,函式可以解壓的檔案大小受限,過大的 ZIP 檔案,要麼下載壓縮檔案後沒有空間存放臨時的解壓檔案,要麼無法下載超過限制的壓縮檔案。而通過 CFS 擴充套件儲存空間,可讀寫的空間不再受到臨時空間的大小限制,在檔案解壓縮場景下,也可以實現大壓縮檔案的解壓了。

而在有些科學計算或 AI 推理的場景中,由於函式的程式碼包目前僅支援解壓後 500 MB 的大小,因此一些很大的依賴庫,無法隨著程式碼包上傳,或上傳為層;在這種情況下,一些依賴庫或依賴檔案例如 AI 推理所需要的模型,需要在函式啟動執行時從外部例如物件儲存中下載到函式的臨時空間中,下載和解壓過程會大大拉長函式的啟動時間,造成初始化耗時變長,影響函式的實際執行。這個問題同時也在一些 Nodejs 的執行環境中容易出現,node 的 modules 依賴較多的情況下,很容易超過程式碼包的體積大小限制。通過掛載使用 CFS 提供的共享可擴充套件空間,可以將依賴包放置到外部空間中,來避免受限。這種情況下,依賴包可以通過另一個掛載了同樣 CFS 空間的函式甚至是 CVM 虛擬機器來進行方便的管理,在 AI 推理場景中,模型都可以通過共享的 CFS 來很容易的從訓練的環境或虛擬機器中完成更新。

在使用雲函式進行物件儲存檔案上傳觸發的音視訊轉碼場景中,CFS 的引入一樣可以擴充套件音視訊轉碼可以處理的檔案大小。在受限臨時檔案儲存空間大小的情況下,音視訊轉碼之前僅能進行小體積視訊檔案或音訊檔案的下載、轉碼和上傳,而大體積視訊的處理,需要利用物件儲存來進行分段的下載、轉碼、上傳和拼接。通過 CFS 的擴充套件空間,可以支援進行大體積視訊檔案的轉碼處理過程。同時,在大體積的視訊檔案處理上,通常利用雲函式的多併發能力,會通過將視訊檔案分片、分別轉碼處理、再次合併轉碼後文件的處理流程,通過這種流程,可以大大加速大檔案的處理速度,充分利用函式的多併發處理能力。在這種處理流程上,可以通過 CFS 的擴充套件,以及跨多併發例項多函式的能力,在同一個 CFS 的空間中,由不同函式分別來完成分片、轉碼、合併的工作。通過這種方式,大大簡化了開發方法,降低了檔案操作的複雜性。

通過對接 CFS 檔案儲存與 SCF 雲函式,為雲函式帶來了很多的擴充套件使用場景,除了上面提到的 3 種之外,還有很多方面可以去嘗試,使用 CFS 來解決 Serverless 應用開發過程中碰到的儲存問題。例如可以通過 CFS 來儲存全域性的業務配置資訊,並在多個函式間共享實現配置共享;可以通過 CFS 儲存 Web 服務中使用者的 session 記錄這類狀態資料等場景。

我們也期待更多的 Serverless 應用開發者,從 CFS + SCF 的使用過程中,持續發現和探索更多的應用場景。

作者演講回放地址:Tencent Serverless Hours 第七期

One More Thing

立即體驗騰訊雲 Serverless Demo,領取 Serverless 新使用者禮包