大廠常用的幾種灰度發(fā)布方案
編輯導(dǎo)語(yǔ):灰度,就是存在于黑與白之間的一個(gè)平滑過(guò)渡的區(qū)域。對(duì)于互聯(lián)網(wǎng)產(chǎn)品來(lái)說(shuō),上線和未上線就是黑與白之分,而實(shí)現(xiàn)未上線功能平穩(wěn)過(guò)渡的一種方式就叫做灰度發(fā)布。不少大廠在產(chǎn)品上線前都會(huì)進(jìn)行灰度測(cè)試,本文作者為大家總結(jié)了大廠常用的幾種灰度發(fā)布方案。
什么是灰度發(fā)布?百度百科的解釋是這樣的:
灰度發(fā)布是指在黑與白之間,能夠平滑過(guò)渡的一種發(fā)布方式。
AB test就是一種灰度發(fā)布方式,讓一部分用戶繼續(xù)用A,一部分用戶開(kāi)始用B,如果用戶對(duì)B沒(méi)有什么反對(duì)意見(jiàn),那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面來(lái)?;叶劝l(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問(wèn)題,以保證其影響度。
從上述可以看出,灰度發(fā)布的作用有以下幾點(diǎn):
- 降低發(fā)布帶來(lái)的影響,雖然功能都在測(cè)試環(huán)境測(cè)過(guò),但畢竟沒(méi)有發(fā)布到生產(chǎn)環(huán)境,如果先讓少部分用戶先使用新版本,提前發(fā)現(xiàn)bug,或者性能問(wèn)題,提前做好修復(fù),就可以降低新版本帶來(lái)的影響;
- 通過(guò)對(duì)新老版本的對(duì)比,觀察新版本帶來(lái)的效果。
結(jié)合工作中使用到的灰度發(fā)布實(shí)踐和對(duì)其他大廠的灰度發(fā)布調(diào)研,總結(jié)了以下灰度發(fā)布方案。
一、灰度發(fā)布的劃分
灰度發(fā)布如果按照端來(lái)分的話,可以分為web前端、客戶端、服務(wù)端灰度。
無(wú)論是哪種灰度,一般需要滿足以下2點(diǎn)要求:
- 需要一個(gè)放量配置,給產(chǎn)品/運(yùn)營(yíng)等工作人員配置放量策略;
- 需要做到同一個(gè)用戶始終訪問(wèn)的是同一個(gè)版本的代碼,如果同個(gè)用戶上個(gè)請(qǐng)求訪問(wèn)的是A版本,下個(gè)請(qǐng)求訪問(wèn)的是B版本,就可能會(huì)出問(wèn)題。
1. web前端灰度
假設(shè)我們的前端資源存放在CDN上面:我們每次發(fā)布一個(gè)新版本,就把資源增量式地上傳到CDN,然后給它分配一個(gè)唯一的版本號(hào),再把所有的版本號(hào)存儲(chǔ)起來(lái)。當(dāng)處理請(qǐng)求時(shí),根據(jù)動(dòng)態(tài)配置的分流策略來(lái)決定用戶使用哪個(gè)版本。
比如分流策略是放量10%,即新版本隨機(jī)放量給10%的用戶使用,當(dāng)用戶首次命中資源版本號(hào)時(shí),需要把用戶id和版本號(hào)的映射關(guān)系存儲(chǔ)起來(lái)(可存到cookie),這樣就能保證同個(gè)用戶上次請(qǐng)求和下次請(qǐng)求訪問(wèn)到的都是同個(gè)版本的代碼。
那如果線上有緊急bug需要修復(fù),又要重新發(fā)布新版本,該如何處理當(dāng)前灰度的狀態(tài)?是趕緊結(jié)束上一個(gè)灰度然后全量發(fā)布還是一起發(fā)上去同時(shí)灰度?一般來(lái)說(shuō),再有新版本發(fā)布或者放量策略發(fā)生變化時(shí),應(yīng)該重新分流灰度。
2. 服務(wù)端灰度
服務(wù)端灰度分為兼容變更灰度和不兼容變更灰度。
1)兼容變更
兼容變更又可分為物理灰度和邏輯灰度。
- 物理灰度:物理灰度比較簡(jiǎn)單,根據(jù)機(jī)器維度進(jìn)行灰度,直接部署新老版本在不同機(jī)器,流量均勻地打在新老版本上面。這種方式雖然簡(jiǎn)單,但不適用于不兼容變更;
- 邏輯灰度:邏輯灰度就是根據(jù)更精確的流量策略來(lái)控制流量,這種灰度一般要寫(xiě)一定的灰度代碼。這種方式能比較精確地控制流量,但是增加了一定的灰度代碼,灰度完成后要?jiǎng)h除相關(guān)灰度代碼,有點(diǎn)麻煩。
2)不兼容變更
不兼容變更指的是更改了當(dāng)前功能,即接口邏輯跟之前版本發(fā)生很大變化,必須要前后端同時(shí)發(fā)布,否則會(huì)有一段時(shí)間服務(wù)不可用。
一般的做法是引入接口版本號(hào),新老版本接口并存,比如 /v1/api 和 /v2/api。前端使用/v2/api版本,當(dāng)過(guò)去一段穩(wěn)定期后(可以是登錄態(tài)時(shí)間失效后),就可下掉/v1/api版本。
3. 客戶端灰度
web前端和服務(wù)端灰度發(fā)布可以在客戶無(wú)感知的情況下平滑進(jìn)行,遇到問(wèn)題也可以快速回滾,但是移動(dòng)客戶端涉及到用戶的主動(dòng)安裝行為,所以上述的方式已經(jīng)不適用。
如果一個(gè)帶有bug的安裝包全量發(fā)布出去,一旦有問(wèn)題,我們只能快速定位問(wèn)題來(lái)提醒用戶安裝新版本,是否安裝取決于用戶,所以客戶端灰度發(fā)布是非常有必要的。
客戶端在啟動(dòng)時(shí),會(huì)向灰度系統(tǒng)發(fā)起請(qǐng)求,灰度系統(tǒng)根據(jù)客戶端傳過(guò)來(lái)的參數(shù)和當(dāng)前的放量策略來(lái)決定是否要給客戶端升級(jí)提醒。一般會(huì)根據(jù)以下幾種策略來(lái)決定給予用戶升級(jí)提醒:
- 根據(jù)用戶設(shè)備的系統(tǒng)和應(yīng)用版本;
- 根據(jù)渠道:發(fā)布到不同應(yīng)用市場(chǎng)的app都會(huì)被打上渠道標(biāo)簽,所以可以根據(jù)渠道來(lái)區(qū)分用戶;
- 根據(jù)設(shè)備ID和用戶ID。
通過(guò)設(shè)備ID主要是為了控制提醒頻率,用戶ID主要是為了區(qū)分出特性用戶,比如對(duì)活躍用戶發(fā)送提醒。
二、灰度放量策略
流量策略一般分為以下幾種:
1. 按流量百分比
先到先得的方式比如限制10%的用戶體驗(yàn)的是新版本,90%的用戶體驗(yàn)的是老版本。先訪問(wèn)網(wǎng)站的用戶就優(yōu)先命中新版本,直到流量用完為止。
2. 按人群劃分
- 按用戶id、用戶ip、設(shè)備類型比如可通過(guò)平時(shí)的埋點(diǎn)上報(bào)數(shù)據(jù)得知用戶的pv、uv、頁(yè)面平均訪問(wèn)時(shí)長(zhǎng)等數(shù)據(jù),根據(jù)用戶活躍度來(lái)讓用戶優(yōu)先體驗(yàn)新版本,進(jìn)而快速觀察使用效果。
- 按地域、性別、年齡等用戶畫(huà)像比如可通過(guò)用戶的性別、年齡等做下新老版本的對(duì)比效果來(lái)看看目標(biāo)用戶在新版本的使用年齡段,性別范圍是多少。
3. 按渠道劃分
比如根據(jù)用戶的注冊(cè)來(lái)源來(lái)放量。
三、灰度發(fā)布的代價(jià)
通過(guò)上面的講解,可以看到一個(gè)完整的灰度發(fā)布,包括前端、后臺(tái)都需要額外的代碼量去實(shí)現(xiàn),如果只有幾萬(wàn)的用戶,要去實(shí)現(xiàn)這樣一套灰度發(fā)布,代價(jià)是比較高的。
但如果是百萬(wàn)~億級(jí)用戶,灰度發(fā)布是很值得的,它不僅能降低新版本bug的風(fēng)險(xiǎn),還能通過(guò)版本對(duì)比,推出最好效果的版本應(yīng)用。
前百度前端工程師,現(xiàn)騰訊前端工程師,公眾號(hào):產(chǎn)品的技術(shù)小課。
本文由 @lemon 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來(lái)自?Unsplash,基于 CC0 協(xié)議
- 目前還沒(méi)評(píng)論,等你發(fā)揮!