由于必須回滾/撤消對所有用戶的部署可能是一種代價高昂的情況(無論是技術(shù)上還是用戶的感知),已經(jīng)有許多技術(shù)允許“嘗試”部署新功能并在發(fā)現(xiàn)問題時輕松“撤消”它們。這些包括:
藍(lán)/綠測試/部署
在這種部署軟件的方法中,維護(hù)了兩個相同的主機(jī)環(huán)境 —— 一個“藍(lán)色” 和一個“綠色”。(顏色并不重要,僅作為標(biāo)識。)對應(yīng)來說,其中一個是“生產(chǎn)環(huán)境”,另一個是“預(yù)發(fā)布環(huán)境”。
在這些實(shí)例的前面是調(diào)度系統(tǒng),它們充當(dāng)產(chǎn)品或應(yīng)用程序的客戶“網(wǎng)關(guān)”。通過將調(diào)度系統(tǒng)指向藍(lán)色或綠色實(shí)例,可以將客戶流量引流到期望的部署環(huán)境。通過這種方式,切換指向哪個部署實(shí)例(藍(lán)色或綠色)對用戶來說是快速,簡單和透明的。
當(dāng)新版本準(zhǔn)備好進(jìn)行測試時,可以將其部署到非生產(chǎn)環(huán)境中。在經(jīng)過測試和批準(zhǔn)后,可以更改調(diào)度系統(tǒng)設(shè)置以將傳入的線上流量指向它(因此它將成為新的生產(chǎn)站點(diǎn))?,F(xiàn)在,曾作為生產(chǎn)環(huán)境實(shí)例可供下一次候選發(fā)布使用。
同理,如果在最新部署中發(fā)現(xiàn)問題并且之前的生產(chǎn)實(shí)例仍然可用,則簡單的更改可以將客戶流量引流回到之前的生產(chǎn)實(shí)例 —— 有效地將問題實(shí)例“下線”并且回滾到以前的版本。然后有問題的新實(shí)例可以在其它區(qū)域中修復(fù)。
金絲雀測試/部署
在某些情況下,通過藍(lán)/綠發(fā)布切換整個部署可能不可行或不是期望的那樣。另一種方法是為金絲雀測試/部署。在這種模型中,一部分客戶流量被重新引流到新的版本部署中。例如,新版本的搜索服務(wù)可以與當(dāng)前服務(wù)的生產(chǎn)版本一起部署。然后,可以將 10% 的搜索查詢引流到新版本,以在生產(chǎn)環(huán)境中對其進(jìn)行測試。
如果服務(wù)那些流量的新版本沒問題,那么可能會有更多的流量會被逐漸引流過去。如果仍然沒有問題出現(xiàn),那么隨著時間的推移,可以對新版本增量部署,直到 100% 的流量都調(diào)度到新版本。這有效地“更替”了以前版本的服務(wù),并讓新版本對所有客戶生效。
功能開關(guān)
對于可能需要輕松關(guān)掉的新功能(如果發(fā)現(xiàn)問題),開發(fā)人員可以添加功能開關(guān)。這是代碼中的 if-then 軟件功能開關(guān),僅在設(shè)置數(shù)據(jù)值時才激活新代碼。此數(shù)據(jù)值可以是全局可訪問的位置,部署的應(yīng)用程序?qū)z查該位置是否應(yīng)執(zhí)行新代碼。如果設(shè)置了數(shù)據(jù)值,則執(zhí)行代碼;如果沒有,則不執(zhí)行。
這為開發(fā)人員提供了一個遠(yuǎn)程“終止開關(guān)”,以便在部署到生產(chǎn)環(huán)境后發(fā)現(xiàn)問題時關(guān)閉新功能。
暗箱發(fā)布
在暗箱發(fā)布中,代碼被逐步測試/部署到生產(chǎn)環(huán)境中,但是用戶不會看到更改(因此名稱中有暗箱一詞)。例如,在生產(chǎn)版本中,網(wǎng)頁查詢的某些部分可能會重定向到查詢新數(shù)據(jù)源的服務(wù)。開發(fā)人員可收集此信息進(jìn)行分析,而不會將有關(guān)接口,事務(wù)或結(jié)果的任何信息暴露給用戶。
這個想法是想獲取候選版本在生產(chǎn)環(huán)境負(fù)載下如何執(zhí)行的真實(shí)信息,而不會影響用戶或改變他們的經(jīng)驗(yàn)。隨著時間的推移,可以調(diào)度更多負(fù)載,直到遇到問題或認(rèn)為新功能已準(zhǔn)備好供所有人使用。實(shí)際上功能開關(guān)標(biāo)志可用于這種暗箱發(fā)布機(jī)制。