從我做Serverless工具開(kāi)始,就經(jīng)常會(huì)遇到有人問(wèn)這樣一個(gè)問(wèn)題:如何保證Serverless業(yè)務(wù)部署更新的一致性。
所謂的一致性在這里指的是:我們通過(guò)工具在本地進(jìn)行項(xiàng)目部署,此時(shí)再有人通過(guò)其他途徑(例如控制臺(tái)等),對(duì)項(xiàng)目進(jìn)行過(guò)更新等操作,此時(shí)我再在本地進(jìn)行項(xiàng)目部署,是不是會(huì)直接覆蓋?
例如,當(dāng)用戶A在本地更新了業(yè)務(wù),因?yàn)橐恍┨厥馇闆r,導(dǎo)致出現(xiàn)了一個(gè)線上異常x,此時(shí)用戶B重新更新,將這個(gè)內(nèi)容修復(fù)了,但是B沒(méi)有及時(shí)同步給A這個(gè)事情,A又更新了新的功能,直接覆蓋了B的內(nèi)容,這個(gè)時(shí)候之前的異常x又出現(xiàn)了,如果此時(shí)在A更新的時(shí)候,可以感知到線上資源已經(jīng)變動(dòng),那么這種事情就不會(huì)再次發(fā)生。
目前基于Serverless Devs的阿里云函數(shù)計(jì)算組件,已經(jīng)支持了線上“異動(dòng)”的感知能力,包括了以下幾個(gè)情況:
本地新建并部署一個(gè)線上沒(méi)有的資源
本地部署完成,線上更新,本地再次部署
本地新建并部署一個(gè)線上已經(jīng)有的資源
實(shí)驗(yàn)準(zhǔn)備
通過(guò)創(chuàng)建一個(gè)函數(shù)(選擇, 選擇):
image
此時(shí)我們查看一下:
image
該項(xiàng)目部署到線上之后的表現(xiàn)就是在區(qū)創(chuàng)建一個(gè)服務(wù),以及函數(shù)
本地新建并部署一個(gè)線上沒(méi)有的資源
此時(shí),我們確定一下線上并沒(méi)有對(duì)應(yīng)資源,所以我們部署一下:
image
部署完成,很順利:
image
打開(kāi)瀏覽器,查看反饋給我們的自定義地址:
image
此時(shí),我們可以在本地,更新一下這個(gè)函數(shù)代碼:
image
保存部署:
image
完成之后,再查看線上資源:
image
整個(gè)過(guò)程,還是比較貼近傳統(tǒng)的基本流程,也沒(méi)有觸發(fā)線上異動(dòng),算是中規(guī)中矩的理想過(guò)程。
本地部署完成,線上更新,本地再次部署
此時(shí),我們對(duì)線上資源進(jìn)行變更,首先在控制臺(tái)找到函數(shù):
總結(jié)
代碼在其他場(chǎng)景被更新,需要我們?cè)诋?dāng)前得到感知,這個(gè)事情其實(shí)是非常重要的,和代碼的安全發(fā)布密不可少。而此時(shí),通過(guò)Serverless Devs是可以做到的。
那么問(wèn)題來(lái)了,如果我已經(jīng)有了一個(gè)項(xiàng)目,我想集成到cd流程,我不想出現(xiàn)交互式操作,應(yīng)該如何處理呢?
此時(shí)我們提供一個(gè)參數(shù),用來(lái)強(qiáng)行覆蓋線上配置,通過(guò)這樣的指令就可以實(shí)現(xiàn)無(wú)交互的,本地優(yōu)先。
每一個(gè)工具的誕生,都要有一個(gè)成長(zhǎng)的過(guò)程,Serverless Devs正在不斷的成長(zhǎng)。期待更多更好的功能出現(xiàn)。