作者|Anycodes
從我做 Serverless 工具開始,就經常會遇到有人問這樣一個問題:如何保證 Serverless 業務部署更新的一致性。
所謂的一致性在這裡指的是:我們通過工具在本地進行項目部署,此時再有人通過其他途徑(例如控制檯等),對項目進行過更新等操作,此時我再在本地進行項目部署,是不是會直接覆蓋?
例如,當用戶 A 在本地更新了業務,因為一些特殊情況,導致出現了一個線上異常情況 “X”,此時用戶 B 重新更新,將這個內容修復了,但是 B 沒有及時同步給 A 這個事情,A 又更新了新的功能,直接覆蓋了 B 的內容,這個時候之前的異常 “X” 又出現了,如果此時在 A 更新的時候,可以感知到線上資源已經變動,那麼這種事情就不會再次發生。
目前基於 Serverless Devs 的阿里雲函數計算組件,已經支持了線上 “異動” 的感知能力,包括了以下幾個情況:
- 本地新建並部署一個線上沒有的資源
- 本地部署完成,線上更新,本地再次部署
- 本地新建並部署一個線上已經有的資源
實驗準備
通過 s init 創建一個函數(選擇 Aibaba Cloud Serverless, 選擇 HTTP Function - Python3 Example ):
此時我們查看一下 s.yaml :
該項目部署到線上之後的表現就是在 cn-hangzhou 區創建一個 fc-deploy-service 服務,以及 http-trigger-function 函數。
實驗過程
本地新建並部署一個線上沒有的資源
此時,我們確定一下線上並沒有對應資源,所以我們部署一下:
部署完成,很順利:
打開瀏覽器,查看反饋給我們的自定義地址:
此時,我們可以在本地,更新一下這個函數代碼:
保存部署:
完成之後,再查看線上資源:
整個過程,還是比較貼近傳統的基本流程,也沒有觸發線上異動,算是中規中矩的理想過程。
本地部署完成,線上更新,本地再次部署
此時,我們對線上資源進行變更,首先在控制檯找到函數:
修改代碼,並部署。
部署完成之後,我們刷新一下剛才的地址:
可以看到已經更新。此時,我們再從本地進行部署:
可以看到,系統已經感知到我們的代碼變化,此時,我們選擇yes,完成之後在查看線上資源:
此處需要額外說明的是,只要是函數計算的服務,函數,觸發器發生變化,此處都可以進行感知,不管是配置還是代碼。
本地新建並部署一個線上已經有的資源
此時,我們再進行最後的實驗,我們將本地項目刪除,重新建設。然後執行部署,由於剛剛實驗過的原因,我們已經在線上存在了這些資源,所以此時算是部署一個線上的資源。
此時可以看到,系統感知到這個資源本地沒部署過,線上並且已經存在,所以此時需要確定是否覆蓋。
總結
代碼在其他場景被更新,需要我們在當前得到感知,這個事情其實是非常重要的,和代碼的安全發佈密不可少。而此時,通過 Serverless Devs 是可以做到的。
那麼問題來了,如果我已經有了一個項目,我想集成到cd流程,我不想出現交互式操作,應該如何處理呢?
此時我們提供一個 --ues-local 參數,用來強行覆蓋線上配置,通過這樣的指令就可以實現無交互的,本地優先。
每一個工具的誕生,都要有一個成長的過程,Serverless Devs 正在不斷的成長。期待更多更好的功能出現。