函式計算——應用初探

流火星空發表於2020-12-30

最近在專案中要使用阿里雲的函式計算功能,所以開始按照說明嘗試本地部署示例服務,並編寫所需功能。參考文件:https://fc.console.aliyun.com/fc/guide/cn-hangzhou#tool

環境為macos。

按照說明,npm install @serverless-devs/s -g 安裝完成,並且示例程式:image-style-transfer也安裝完畢。

但s deploy執行時報錯:

End the pre-hook
Error: "accountid" must be passed in
Project StyleComponent failed to execute
End of method: deploy

********** The operation was not fully successful **********
> Project Run Error: StyleComponent
Error: Error: "accountid" must be passed in

可以看到提示,是部署過程中缺失accountid導致。 如果是首次執行 s deploy命令,在執行過程中能看到提示在控制檯輸入accountid 和 祕鑰資訊。但我當時沒有注意,敲了多次Enter,導致錯過了輸入的時機。而官方文件也並沒有在示例中給出相應的問題和解決方法。

仔細研讀完整的函式計算相關文件之後,按照一般的函式計算部署方式,我們需要提供一個.env檔案,其中儲存accountid 和 ACCESS_KEY_SECRET等資訊。

關於冷啟動:

所謂冷啟動,是指函式計算被首次呼叫時,需要做一些初始化動作,導致響應耗時較長。回到根本,函式計算是一種彈性擴容的能力支援,讓我們以呼叫遠端方法的方式來執行一些計算邏輯,而不用關心高併發帶來的資源消耗、動態擴容支援、費用等問題。它的實現採用的是k8s+docker方式,初始資源載入包括建立pod、拉取映象等動作,那麼顯然會大於僅僅執行計算邏輯的耗時。

為了解決這個問題,我們採用的是定時執行,類似於保活的策略,來保證容器不會被銷燬。

阿里雲最佳實踐文件:https://help.aliyun.com/document_detail/140338.html?spm=a2c4g.11174283.6.673.20685212lavP6J

文件中,完整的解決思路包括:

  1. 精簡緊湊的程式碼包: 開發者要儘可能瘦身程式碼包,去掉不必要的依賴。降低 Download/Extract Code 的時間。例如對 Nodejs 函式使用 npm prune, 對 Python 函式使用autoflake,autoremove 去除沒有使用的依賴。另外一些第三方庫中可能會包含測試用例原始碼,無用 binary 和資料檔案。有選擇地刪除無用檔案可以降低函式程式碼下載解壓時間。
  2. 選擇合適的函式語言: 由於語言理念的差異,Java 執行時冷啟動時間通常要高於其他語言。對於冷啟動延遲敏感的應用。在熱啟動延遲差別不大的情況下,使用 Python 這樣的輕量語言可以大幅降低長尾延遲。
  3. 選擇合適的記憶體: 在併發量一定的情況下,函式記憶體越大,冷啟動表現越優。
  4. 降低冷啟動概率:
    • 使用定時觸發器預熱函式
    • 使用 Initializer 函式入口,函式計算會非同步呼叫初始化介面,消除掉 “User Code Init” 的時間,在函式計算系統升級或者函式更新過程中,使用者對冷啟動無感知。

相關文章