【讀書筆記-023】持續(xù)交付2.0之低風(fēng)險(xiǎn)發(fā)布

持續(xù)交付2.0的快速驗(yàn)證環(huán)要求團(tuán)隊(duì)能夠高頻發(fā)布,盡快驗(yàn)證最小可行性解決方案;是否高頻發(fā)布會(huì)帶來版本質(zhì)量的下降和生產(chǎn)環(huán)境的不穩(wěn)定?相關(guān)統(tǒng)計(jì)表明,隨著部署頻率的提升,以及總代碼量和提交量次數(shù)的提高,嚴(yán)重缺陷數(shù)量并沒有隨之提高。

收益與成本共存

高頻發(fā)布模式中,每次發(fā)布的內(nèi)容通常都會(huì)少于低頻發(fā)布中每次發(fā)布的內(nèi)容量,收益主要包括:

  • 有更多機(jī)會(huì)與真實(shí)用戶互動(dòng),從而快速?zèng)Q定或調(diào)整自己產(chǎn)品的前進(jìn)方向;
  • 由于每次變更規(guī)模較小,軟件系統(tǒng)沒有劇烈的變化,從而降低部署風(fēng)險(xiǎn);
  • 單次部署成本降低,且趨于恒定,小迭代變更影響范圍受控,自動(dòng)化設(shè)施的建設(shè)也降低了成本和精力;
  • 出現(xiàn)問題易定位、易修復(fù),且能夠快速更正。

無論怎樣,都無法保證100%消除發(fā)布風(fēng)險(xiǎn),不斷尋找降低發(fā)布風(fēng)險(xiǎn)的方法是一個(gè)重要的問題。

降低發(fā)布風(fēng)險(xiǎn)的方法

藍(lán)綠部署

  • 準(zhǔn)備兩套完全一致的運(yùn)行環(huán)境,其中一套環(huán)境作為正式環(huán)境,對外提供服務(wù);
  • 另一套環(huán)境作為新版本的預(yù)生產(chǎn)環(huán)境,部署軟件的新版本,并對其進(jìn)行驗(yàn)收測試;
  • 當(dāng)確保沒有問題后,將訪問流量引流到這個(gè)新版本所在的環(huán)境中,作為正式的生產(chǎn)環(huán)境,同時(shí)保持舊版本所在環(huán)境不變;
  • 確定新版本沒有問題后,再將舊版本所運(yùn)行的環(huán)境作為下一個(gè)新版本的預(yù)生產(chǎn)環(huán)境,部署未來的新版本,“藍(lán)”和“綠”僅代表兩個(gè)相互獨(dú)立的部署環(huán)境。


    藍(lán)綠部署

    在實(shí)際應(yīng)用過程中,數(shù)據(jù)庫的復(fù)制的時(shí)間成本很高,而且空間成本也很高,因此,很多藍(lán)綠部署方案會(huì)使用相同的數(shù)據(jù)庫服務(wù),只是軟件部署使用不同的兩套環(huán)境。這種情況下,要求同一個(gè)數(shù)據(jù)存儲(chǔ)格式必須對新舊兩個(gè)軟件版本做兼容性處理。


    共享數(shù)據(jù)庫的藍(lán)綠部署

滾動(dòng)部署

從服務(wù)集群中選擇一個(gè)或多個(gè)服務(wù)單元,停止服務(wù)后執(zhí)行版本升級,再重新將其投入使用,循環(huán)往復(fù),直至集群中所有服務(wù)的事來都更新到新版本。與藍(lán)綠部署相比,這種方式更節(jié)省資源。


滾動(dòng)部署

金絲雀發(fā)布與灰度發(fā)布

金絲雀發(fā)布:通過讓一小部分用戶先行使用版本,以便提前發(fā)現(xiàn)軟件存在的問題,從而避免讓更多用戶收到傷害的發(fā)布方式。

金絲雀發(fā)布的來源:17世紀(jì)英國礦工發(fā)現(xiàn)金絲雀對瓦斯氣體很敏感,為了保證安全,礦工們每次下井工作時(shí)都帶上一只金絲雀,如果金絲雀因無法抵抗瓦斯氣體而死亡,礦工就知道井下有毒氣,立馬停止工作回到地面。

灰度發(fā)布:將發(fā)布階段分成不同的階段,每個(gè)階段的用戶數(shù)量逐級增加,如果新版本在當(dāng)前階段沒有發(fā)現(xiàn)問題,就再擴(kuò)展用戶數(shù)量進(jìn)入下一階段,直至擴(kuò)展到全部用戶,它是金絲雀發(fā)布的一種延伸。

金絲雀發(fā)布與灰度發(fā)布

實(shí)現(xiàn)金絲雀和灰度發(fā)布的兩種方式

  • 開關(guān)隔離方式:將軟件的新版本部署到生產(chǎn)環(huán)境中的所有節(jié)點(diǎn),通過配置開關(guān)的方式,針對不同范圍的用戶開放新功能,在網(wǎng)絡(luò)接入層、Web層、業(yè)務(wù)邏輯層都可以用于設(shè)計(jì)灰度方案,具體的灰度方案需要根據(jù)具體業(yè)務(wù)場景確定;
  • 滾動(dòng)部署方式:將軟件新版本部署到生產(chǎn)環(huán)境中的一部分節(jié)點(diǎn)上

暗發(fā)布

功能或特性在正式發(fā)布之前,將其第一個(gè)版本部署到生產(chǎn)環(huán)境,以便在向最終用戶提供該功能之前,團(tuán)隊(duì)可以對其進(jìn)行測試,并發(fā)現(xiàn)可能的錯(cuò)誤?!鞍怠?,代表用戶無感知,可以通過開關(guān)技術(shù)來實(shí)現(xiàn)。例如,某公司重新開發(fā)了一個(gè)在線新聞推薦算法,就可以配置一個(gè)開關(guān),當(dāng)開關(guān)打開時(shí)就會(huì)有流量流入這個(gè)算法,但用戶不知道他使用的是新算法或者老算法,如果一旦性能不好或者功能存在問題,則立即關(guān)閉這個(gè)開關(guān)。還可以通過流量克隆的方式來進(jìn)行,對每次請求都克隆一份,發(fā)送給新算法驗(yàn)證。

開關(guān)方式的暗部署

流量克隆方式的暗部署

高頻發(fā)布支撐技術(shù)

某個(gè)功能比較復(fù)雜,無法在兩次發(fā)布之間完成開發(fā),如何來處理這個(gè)問題?

  • 拆分功能:將一個(gè)功能進(jìn)行分解,分解為更小的在一個(gè)開發(fā)周期內(nèi)能夠完成的功能集;
  • 先后再前:先實(shí)現(xiàn)服務(wù)端功能,再實(shí)現(xiàn)用戶界面,即先實(shí)現(xiàn)用戶不可見的功能,同時(shí)要確保不影響原有功能,即使新功能的代碼被帶到生產(chǎn)環(huán)境中,因?yàn)闆]有操作入口,也不會(huì)對發(fā)布有影響,同時(shí)可以通過使用暗部署+流量克隆的方式來驗(yàn)證新功能在后頭服務(wù)端實(shí)現(xiàn)方面的質(zhì)量。
    高頻發(fā)布支撐技術(shù)

功能開關(guān)技術(shù)

對高頻發(fā)布的軟件部署來說,開關(guān)技術(shù)的兩種新的用途:

  • 隔離:將未完成功能的代碼隔離在執(zhí)行路徑之外,使之對用戶不產(chǎn)生影響;
  • 快速止血:一旦生產(chǎn)環(huán)境出了問題,直接找到對應(yīng)功能的開關(guān)選項(xiàng),使其設(shè)置為關(guān)閉。

數(shù)據(jù)遷移技術(shù)

  • 只增不刪:字段盡可能只增不刪,對數(shù)據(jù)庫表中的原有字段不再進(jìn)行修改和刪除操作,做到版本兼容,便于平穩(wěn)升級和快速回退
  • 數(shù)據(jù)遷移:對于無法做到兼容的變更,比如數(shù)據(jù)庫軟件變更,原有系統(tǒng)拆分等,為了確保安全,通常按照以下五個(gè)步驟:
  1. 為數(shù)據(jù)庫結(jié)構(gòu)增加一個(gè)新版本;
  2. 修改應(yīng)用程序,同時(shí)向兩個(gè)版本的結(jié)構(gòu)中寫入數(shù)據(jù);
  3. 編寫腳本程序,以后臺(tái)服務(wù)的方式將原來的歷史數(shù)據(jù)回填到新版本的結(jié)構(gòu)中;
  4. 修改應(yīng)用程序,從新舊兩個(gè)版本中讀取數(shù)據(jù),并進(jìn)行比較,確保一致;
  5. 當(dāng)確認(rèn)無誤后,修改應(yīng)用程序,只向新版本結(jié)構(gòu)寫入數(shù)據(jù),可將原來的舊版本保留一段時(shí)間,以防止未預(yù)料的問題出現(xiàn)。

升級替代回滾

在版本發(fā)布過程中,總會(huì)遇到部署或發(fā)布后出現(xiàn)一些問題,需要馬上修復(fù),如果沒有使用開關(guān)技術(shù),盡可能以代碼升級的方式替代二進(jìn)制回滾(將最新版本的代碼從代碼中剔除,然后再次提交),這種場景得益于持續(xù)交付的“小步、獨(dú)立、頻繁”的原則。

影響發(fā)布頻率的因素

在決定軟件的發(fā)布頻率時(shí),需要綜合考慮以下影響因素:

  • 增量發(fā)布帶來的收益和可能性
  • 每次發(fā)布或部署的操作執(zhí)行成本有多高
  • 出現(xiàn)問題的頻率與由這些問題帶來的成本有多少
  • 維護(hù)同一軟件的眾多不同版本帶來的成本
  • 高頻發(fā)布模式對工程師的技能要求
  • 支撐這種高頻發(fā)布所需要的基礎(chǔ)工具設(shè)施與流程完整性
  • 組織對這種高頻發(fā)布的態(tài)度和文化取向

總結(jié)

因?yàn)椴渴鸢l(fā)布有風(fēng)險(xiǎn),大家均習(xí)慣于推遲風(fēng)險(xiǎn),但是兩次發(fā)布之間的間隔越長,累積的代碼變更越多,所需質(zhì)量驗(yàn)證時(shí)間就越長;通過降低部署發(fā)布的風(fēng)險(xiǎn),在提高發(fā)布頻率的同時(shí),也會(huì)鼓舞團(tuán)隊(duì)士氣,更能夠盡快運(yùn)行持續(xù)交付的驗(yàn)證環(huán),驗(yàn)證探索環(huán)得到的最小可行性解決方案,快速指引團(tuán)隊(duì)前進(jìn)的方向。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一打開朋友圈,一股濃濃的雞湯味便撲面而來,而那些經(jīng)不起絲毫推敲、毫無邏輯可言的雞湯居然擁有那么多忠實(shí)的擁躉,真是...
    糊小姐閱讀 200評論 3 6
  • 這是一個(gè)特別的年份,2017.07,我從我的母校畢業(yè),9月又進(jìn)入學(xué)校,目的地相同, 不同的是,以前我是一名...
    義馬181趙靜閱讀 256評論 0 0
  • 今天的我,打完卡,并沒有去運(yùn)動(dòng),因?yàn)樽约翰粻帤獾纳眢w,隨時(shí)都會(huì)讓我不能再堅(jiān)持運(yùn)動(dòng)。 從昨晚就一直難受,早上起來就坐...
    邊云興閱讀 151評論 1 0
  • 強(qiáng)顏歡笑,有點(diǎn)累。
    always_i閱讀 221評論 0 0

友情鏈接更多精彩內(nèi)容