天天看點

函數計算——應用初探

最近在項目中要使用阿裡雲的函數計算功能,是以開始按照說明嘗試本地部署示例服務,并編寫所需功能。參考文檔: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、拉取鏡像等動作,那麼顯然會大于僅僅執行計算邏輯的耗時。

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

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