容器鏡像相比于代碼包有更好的可移植性和更豐富的工具鏈生態,但其自帶的與應用無關的數據極易使鏡像臃腫,GB級鏡像會導致分鐘級冷啟動。開啟鏡像加速后提速約90%,將分鐘級的鏡像拉取縮短至秒級。本文介紹使用ACR個人版實現鏡像啟動加速的使用原理等。
使用原理
對于運行環境為Custom Container且使用阿里云容器鏡像服務ACR個人版的函數,函數計算默認為其開啟鏡像啟動加速功能。每次創建或更新該類函數時,函數計算會扮演服務RAM角色,使用臨時的AccessKey拉取鏡像,并且轉存至函數計算系統的加速鏡像緩存服務中。轉存結束后,函數中的自定義容器鏡像啟動速度將會得到顯著提升。
注意事項
默認支持鏡像加速的地域有華北2(北京)、華北3(張家口)、華東1(杭州)、華東2(上海)、華南1(深圳)、中國香港、新加坡、美國(硅谷)、美國(弗吉尼亞)和日本(東京)。
如果您同意使用鏡像加速,則代表您同意并授權函數計算拉取您倉庫內的鏡像并轉存至函數計算服務內部的加速緩存服務中。鏡像數據將被加密,并且具備網絡隔離和身份鑒權,以保證足夠的數據安全性。請確保將鏡像轉存在函數計算系統內部存儲服務的操作符合您所在機構的安全規范和指導。
創建或更新使用ACR個人版鏡像的函數后,由于轉存鏡像也有一定的時間消耗,在加速鏡像可用之前,該函數在函數計算控制臺禁止使用。加速鏡像通常會在創建或更新函數后5分鐘內完成。
查看鏡像加速準備狀態
您可以通過以下任一方式查看鏡像加速準備狀態,來判斷當前被加速的鏡像是否可用。
在函數計算控制臺的函數詳情頁面的函數配置頁簽,找到環境信息區域,即可查看鏡像加速準備狀態,取值如下:
準備中:對應
Preparing
。可用:對應
Ready
。失敗:對應
Failed
。
示例如下:
調用GetFunction接口,根據返回的accelerationInfo的status參數判斷當前鏡像加速準備狀態。主要的狀態如下:
Preparing
:加速正在準備中,這時調用會使用沒有加速效果的原始鏡像。Ready
:加速完成,后續函數調用會有加速效果。Failed
:加速失敗。
版本控制最佳實踐
如果您使用了ACR個人版,更新函數鏡像會觸發新的加速鏡像轉存。在加速鏡像可用前的一段時間內,函數調用會拉取原始鏡像從而失去函數加速運行效果。對此,您可參照以下流程通過管理函數和管理版本的方式來體系化地發布函數:
更新函數,此時會連帶更新服務的LATEST版本。
等待鏡像加速準備狀態從準備中狀態至可用后,發布一個新的版本。
將別名切換到新的服務版本。
查看加速效果
示例項目puppeteer-pdf中提供了一個使用Node.js Express結合Puppeteer將網頁轉換成PDF的示例。
加速前,端到端耗時66.51s。加速后僅需4.3s,冷啟動速度提升93.5%。示例代碼如下:
time curl -H "x-fc-invocation-target: 2016-08-15/proxy/CustomContainerDemo/puppeteer-pdf-no-accl" https://$ACCOUNT_ID.$REGION.fc.aliyuncs.com/generate-pdf\?url\=http://example.com -o /tmp/fc-demo-puppeteer-pdf-no-accl.pdf
# Time spent: 0.06s user 0.09s system 0% cpu 1:06.51 total time
# 鏡像加速后冷啟動
curl -H "x-fc-invocation-target: 2016-08-15/proxy/CustomContainerDemo/puppeteer-pdf-accl" https://$ACCOUNT_ID.$REGION.fc.aliyuncs.com/generate-pdf\?url\=http://example.com -o /tmp/fc-demo-puppeteer-pdf-accl.pdf
# Time spent: 0.05s user 0.06s system 0% cpu 4.300 total time
在測試過程中可能存在誤差,請以實際情況為準。