天天看點

如何保證 Serverless 業務部署更新的一緻性?

從我做 Serverless 工具開始,就經常會遇到有人問這樣一個問題:如何保證Serverless業務部署更新的一緻性。

所謂的一緻性在這裡指的是:我們通過工具在本地進行項目部署,此時再有人通過其他途徑(例如控制台等),對項目進行過更新等操作,此時我再在本地進行項目部署,是不是會直接覆寫?

例如,當使用者 A 在本地更新了業務,因為一些特殊情況,導緻出現了一個線上異常情況“x”,此時使用者 B 重新更新,将這個内容修複了,但是 B 沒有及時同步給 A 這個事情,A 又更新了新的功能,直接覆寫了 B的内容,這個時候之前的異常 x 又出現了,如果此時在 A 更新的時候,可以感覺到線上資源已經變動,那麼這種事情就不會再次發生。

目前基于 Serverless Devs 的阿裡雲函數計算元件,已經支援了線上“異動”的感覺能力,包括了以下幾個情況:

  1. 本地建立并部署一個線上沒有的資源
  2. 本地部署完成,線上更新,本地再次部署
  3. 本地建立并部署一個線上已經有的資源

實驗準備

通過s init建立一個函數(選擇Alibaba Cloud Serverless, 選擇HTTP Function - Python3 Example):

如何保證 Serverless 業務部署更新的一緻性?

此時我們檢視一下s.yaml:

如何保證 Serverless 業務部署更新的一緻性?

該項目部署到線上之後的表現就是在cn-hangzhou區建立一個fc-deploy-service服務,以及http-trigger-function函數

此時,我們确定一下線上并沒有對應資源,是以我們部署一下:

如何保證 Serverless 業務部署更新的一緻性?

部署完成,很順利:

如何保證 Serverless 業務部署更新的一緻性?

打開浏覽器,檢視回報給我們的自定義位址:

如何保證 Serverless 業務部署更新的一緻性?

此時,我們可以在本地,更新一下這個函數代碼:

如何保證 Serverless 業務部署更新的一緻性?

儲存部署:

如何保證 Serverless 業務部署更新的一緻性?

完成之後,再檢視線上資源:

如何保證 Serverless 業務部署更新的一緻性?

整個過程,還是比較貼近傳統的基本流程,也沒有觸發線上異動,算是中規中矩的理想過程。

此時,我們對線上資源進行變更,首先在控制台找到函數:

如何保證 Serverless 業務部署更新的一緻性?

修改代碼,并部署。

如何保證 Serverless 業務部署更新的一緻性?

部署完成之後,我們重新整理一下剛才的位址:

如何保證 Serverless 業務部署更新的一緻性?

可以看到已經更新。此時,我們再從本地進行部署:

如何保證 Serverless 業務部署更新的一緻性?

可以看到,系統已經感覺到我們的代碼變化,此時,我們選擇yes,完成之後在檢視線上資源:

如何保證 Serverless 業務部署更新的一緻性?

此處需要額外說明的是,隻要是函數計算的服務,函數,觸發器發生變化,此處都可以進行感覺,不管是配置還是代碼。

此時,我們再進行最後的實驗,我們将本地項目删除,重建立設。然後執行部署,由于剛剛實驗過的原因,我們已經線上上存在了這些資源,是以此時算是部署一個線上的資源。

如何保證 Serverless 業務部署更新的一緻性?

此時可以看到,系統感覺到這個資源本地沒部署過,線上并且已經存在,是以此時需要确定是否覆寫。

總結

代碼在其他場景被更新,需要我們在目前得到感覺,這個事情其實是非常重要的,和代碼的安全釋出密不可少。而此時,通過Serverless Devs是可以做到的。

那麼問題來了,如果我已經有了一個項目,我想內建到cd流程,我不想出現互動式操作,應該如何處理呢?

此時我們提供一個--use-local參數,用來強行覆寫線上配置,通過這樣的指令就可以實作無互動的,本地優先。

每一個工具的誕生,都要有一個成長的過程,Serverless Devs正在不斷的成長。期待更多更好的功能出現。