git灰度發布版本 一種前端灰度發布方案

2021-10-13 01:35:54 字數 3126 閱讀 8780

本文介紹一種前端灰度發布方案,主要解決的是傳統的灰度發布只能以機器維度進行分組的問題。提供一種使用者維度分組的灰度發布機制。

傳統灰度發布,因為是以機器分組,所以要求服務是無狀態的。所謂無狀態就是對請求的處理是上下文無關的。有長連線、讀寫檔案、快取等場景,就是所謂」有狀態「的。有狀態的服務,如果使用者的前乙個請求打在機器a,後乙個請求打在機器b,就會出問題。

所以,有狀態的服務灰度發布,要做到:

同一使用者始終訪問同一版本的**

放量過程像傳統發布一樣可控

本灰度發布方案對構建、部署、啟動服務、處理請求階段分別做改造,實現有狀態服務灰度發布。

方案概述

我們把線上的**稱為stable版,本次發布的新**稱為beta版。先整體描述一下方案:

用git tag標識每次發布

在構建階段生成tag,同時用tag名稱來命名manifest.json

每次構建完新版本後,從cdn源機器取回上次發布的manifest.json檔案,一併放在dist目錄下

部署階段全量部署到所有機器,在執行階段來決定訪問哪個版本的**

node層啟動服務時,讀dist目錄下的兩份manifest.json檔案,這樣就能拿到新舊兩個版本的檔案清單

處理請求時,根據動態配置的放量資訊和分流策略,來決定使用哪個manifest.json中的檔案

版本號資訊放在cookie中,以保證同一使用者始終訪問同一版本**

開發階段

正常開發**,無需有任何額外操作。

構建階段

publish-tag

新增乙個git tag,以p-開頭,意為publish。每次發布都有乙個tag標記,格式為p-201911111001-lvdabao.標記發布時間與發布者。構建完成並同步cdn成功後,會將該tag同步到git倉庫。

manifest.json

manifest.json是webpack構建完畢後的檔案清單,可以用webpack-manifest-plugin外掛程式生成。如有特殊需求也可以自己編寫。我們是自己編寫,並在動態渲染首頁html時讀取清單內容並輸出script標籤。

每次構建生成的檔名稱是這樣的格式:manifest-p-201911111001-lvdabao.json,這樣每次發布都生成對應tag命名的manifest.json檔案。

啟動服務時可以一次讀取到記憶體中,並不是處理每個請求都讀一下檔案,所以不必擔心效能。

獲取上次發布的版本資訊

我們是用publish-tag來標識版本號的,只要拿到上次發布時的tag,就能取到對應的manifest.json檔案。所以構建的最後一步就是把上一版的manifest.json檔案從cdn源機器取到當前構建後的dist目錄下,為後續服務啟動時使用。

取上次的tag也很簡單,乙個git命令搞定:git tag --sort=-taggerdate | grep "^p-.*" | head -n 1

容錯機制

如果上次發布的版本有重大問題,不能作為stable版使用,有什麼辦法呢?

所以我們增加了乙個額外流程,允許構建的時候傳入環境變數,指定stable tag。這樣在獲取stable版本資訊時,優先取環境變數中指定的。

部署階段

部署跟普通流程沒什麼區別,將dist目錄發布到目標機器就行了。每次部署的dist檔案包含以下:

beta版的manifest.json檔案

beta版的資源檔案

stable版的manifest.json檔案

啟動服務

啟動服務時我們需要幹兩件事情:

把兩個manifest.json檔案讀到記憶體中,供分流時使用

自動修改放量配置,將新版本比例改為0

放量配置

上面提到了放量配置,這個是放在單獨的配置系統中的,當然簡單點放在服務端也是可以的。用途就是根據當前使用者的uuid,來確定使用者該使用哪個版本的資源。

配置內容也及其簡單:

percent: 10

percent即是beta版的放量比例,10表示10%的使用者使用beta版。全量的時候手動改為100就行啦。

因為啟動服務的時候會自動將percent改為0,所以每次發布完後,我們只需根據放量節奏逐步擴大percent的值就好。

處理請求

萬事具備,我們在處理請求的時候,就很easy了。只需獲取當前使用者的uuid,node層通過rpc呼叫獲取到放量配置,通過分流策略來計算應該使用哪個版本的資源。

我們的首頁是動態輸出的(ssr),拿到分流策略得出的tag,把相應的manifest.json中的檔案輸出,這樣就控制了哪部分使用者使用beta版本。

分流策略

最後再談談分流策略,這塊也是有很多細節的。分流策略要做的核心工作:

根據放量配置來決定當前使用者應使用的資源版本

確保使用者的分流路線穩定,即下次請求頁面應與上次的分流結果一致

新版本發布或放量比例變化時,重新分流

首先,放量配置只有乙個百分比數字,我們需要把uuid雜湊化,即把uuid字串對應到0-99間固定的數字。演算法可以有很多,我們選一種簡單的,取每個字元的ascii碼相加,然後再除100取餘。偽**:

for (i = 0; i < uuid.length; i++) {

hash += uuid.charcodeat(i);

取到的這個hash就可以與放量百分比比較,在範圍內就使用beta版。

另外乙個比較麻煩的事情是第2點,為了讓使用者下次訪問的時候能夠跟首次的分流一致,我們需要把首次分流的結果儲存在cookie中。當請求來的時候先分析cookie中的版本資訊,如果可用則優先用cookie。不可用的話清掉cookie,再去計算分流。

那麼既然uuid的雜湊演算法能保證hash值穩定,每次都用uuid計算不行嗎?原因就是我們訪問環境的特殊,uuid的穩定性不能保證,相對來說還是cookie更穩定。這個看專案吧,如果你的專案uuid穩定,那可以省去用cookie。

總結通過這套方案我們實現了以使用者維度進行分組的灰度發布,並且整個流程足夠自動化,業務開發無感知,需要手動操作的只有修改放量配置。

有朋友可能想說,你這個方案和abtest很相似啊!其實abtest和本方案的差別主要有:

需要同時上線ab兩套新**

最終會丟棄其中一套**

儘管看起來差別不大,但abtest方案的構建、部署、分流控制都會有所區別。

當然,如果我們把abtest退一步,認為stable版是a,新上線**是b,那麼將本方案改造成abtest方案也很容易。

git灰度發布版本 一種前端灰度發布方案

本文介紹一種前端灰度發布方案,主要解決的是傳統的灰度發布只能以機器維度進行分組的問題。提供一種使用者維度分組的灰度發布機制。傳統灰度發布,因為是以機器分組,所以要求服務是無狀態的。所謂無狀態就是對請求的處理是上下文無關的。有長連線 讀寫檔案 快取等場景,就是所謂 有狀態 的。有狀態的服務,如果使用者...

git灰度發布版本 Git發布2 30版本

git 2.30版本已於北京時間今天凌晨3點發布,是該廣受歡迎的分布式修訂版本控制系統的最新穩定版本更新,git由linux核心發明者linus大神於2005年推出。2020年早些時候,git 2.28版本帶來了對可配置 預設分支名稱的支援,以取代到目前為止的預設 master 分支名稱的用法。對於...

線上版本灰度發布策略

從接觸運維開始,最苦逼的事情就是業務上線,為什麼這麼說?就是因為有了很多的大坑隊友。不是因為開發的童鞋漏提 就是因為測試童鞋線下測試的不到位導致 扔到線上後出現各種問題,各種404。近期和各位童鞋研究了應對這種現象的解決方案,得到了如下結果 上線分為如下幾種等級 測試發布 預發布 灰度發布 正式發布...