灰度發(fā)布的定義:
灰度發(fā)布是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式。AB test就是一種灰度發(fā)布方式,讓一部分用戶繼續(xù)用A,一部分用戶開始用B,如果用戶對B沒有什么反對意見,那么逐步擴大范圍,把所有用戶都遷移到B上面來?;叶劝l(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度,而我們平常所說的金絲雀部署也就是灰度發(fā)布的一種方式。
灰度發(fā)布結(jié)構(gòu)圖如下:

灰度發(fā)布/金絲雀發(fā)布由以下幾個步驟組成:
準(zhǔn)備好部署各個階段的工件,包括:構(gòu)建工件,測試腳本,配置文件和部署清單文件。
從負(fù)載均衡列表中移除掉“金絲雀”服務(wù)器。
升級“金絲雀”應(yīng)用(排掉原有流量并進行部署)。
對應(yīng)用進行自動化測試。
將“金絲雀”服務(wù)器重新添加到負(fù)載均衡列表中(連通性和健康檢查)。
如果“金絲雀”在線使用測試成功,升級剩余的其他服務(wù)器。(否則就回滾)
除此之外灰度發(fā)布還可以設(shè)置路由權(quán)重,動態(tài)調(diào)整不同的權(quán)重來進行新老版本的驗證。
灰度發(fā)布涉及到的專有名詞解釋:
灰度期:灰度發(fā)布開始到結(jié)束期間的這一段時間,稱為灰度期。
灰度發(fā)布引擎:對于一般的小系統(tǒng)并不需要單獨的灰度發(fā)布引擎,可以參考A/B測試中做法,在頁面javascript或服務(wù)器端實現(xiàn)分流的規(guī)則即可。但對于大型的互聯(lián)網(wǎng)應(yīng)用而言,單獨的用于管理用戶分流的發(fā)布引擎就很有必要了。
用戶標(biāo)識:用于區(qū)分用戶,輔助數(shù)據(jù)統(tǒng)計,保證灰度發(fā)布過程中用戶體驗的連貫性(避免用戶在新舊版本中跳變,匿名Web應(yīng)用比較容易有這個問題)。匿名Web應(yīng)用可采用IP、Cookie等,需登錄的應(yīng)用可直接采用應(yīng)用的帳號體系。
目標(biāo)用戶選取策略:即選取哪些用戶先行體驗新版本,是強制升級還是讓用戶自主選擇等。強制升級可考慮的因素很多,包括但不限于地理位置、用戶終端特性、用戶自身特點等。用戶自主選擇,讓用戶自主選擇采用stable、beta、unstable channel的版本。在用戶有明確預(yù)期的情況下自行承擔(dān)試用風(fēng)險。
數(shù)據(jù)反饋:用戶數(shù)據(jù)反饋:在得到用戶允許的前提下,收集用戶的使用新版本應(yīng)用的情況。如客戶端性能、客戶端穩(wěn)定性、使用次數(shù)、使用頻率等。用于與舊版本進行對比,決策后續(xù)是繼續(xù)擴大新版本投放范圍還是回滾。服務(wù)端數(shù)據(jù)反饋:新版本服務(wù)端性能、服務(wù)端穩(wěn)定性等,作用與用戶數(shù)據(jù)反饋類似。
新版本公關(guān)運營支持:對于改版級別的大型升級,需要配合公關(guān)運營支持,用于及時處理用戶在微博、博客等渠道給出的“顯式反饋”。對比通過隱式數(shù)據(jù)反饋得到的結(jié)論后,綜合考慮應(yīng)對策略。
實現(xiàn)灰度發(fā)布的兩種技術(shù)方式:
一、在代碼中做。一套線上環(huán)境,代碼中做開關(guān),對于不同的用戶走不同的邏輯
二、在接入層做。多套(隔離的)線上環(huán)境,接入層針對不同用戶轉(zhuǎn)發(fā)到不同的環(huán)境中
接入層采用nginx,可以基于IP或cookie的方式進行分流,由于我們是商業(yè)ERP系統(tǒng),有用戶登錄的邏輯,自然選擇基于cookie的策略。
就基于cookie的分流策略而言,又有兩種實現(xiàn)方案
nginx維護Cookie名單文件,每來一個請求看Cookie是否在名單中,做不同的轉(zhuǎn)發(fā)
nginx不維護Cookie名單文件,根據(jù)Cookie的特征進行轉(zhuǎn)發(fā)
第一種方案的缺點顯而易見,每次請求判斷是否是灰度用戶時間復(fù)雜度為O(N);且變更名單,需要操作接入層服務(wù)。第二種方案具體的實現(xiàn)策略:
1 業(yè)務(wù)中維護白名單文件(存放在數(shù)據(jù)庫中)
2 在登陸時,如果用戶在名單中則給用set特定標(biāo)識的Cookie;退出或Session過期后Cookie失效
3 nginx匹配特定Cookie,做轉(zhuǎn)發(fā)
這樣,調(diào)整灰度的范圍,只需要操作數(shù)據(jù)庫即可,無需重啟服務(wù)。
灰度發(fā)布的企業(yè)實際案例:
淘寶網(wǎng)灰度發(fā)布(轉(zhuǎn)載):
從產(chǎn)品經(jīng)理的角度來看:淘寶的發(fā)布流程一般是這樣的,首先產(chǎn)品經(jīng)理說服老板、老板的老板、開發(fā)Leader、開發(fā)成員、測試、設(shè)計師、BI等等我們要做的這個產(chǎn)品是牛逼而且有價值的。然后確認(rèn)改版的設(shè)計并完成開發(fā)。開發(fā)后的版本會在內(nèi)部工程用的服務(wù)器上(需要指向特定 URL)可以看到,然后是時間1周~2個月的測試,測試完成驗收達(dá)到設(shè)計目標(biāo)和發(fā)布標(biāo)準(zhǔn)后,會進行內(nèi)部發(fā)布。內(nèi)部發(fā)布后的版本,阿里巴巴內(nèi)網(wǎng)上淘寶看到的就都是新版本了,這叫做“小淘寶”發(fā)布。這個階段可能持續(xù)1天~1個月,內(nèi)部員工會看到新的頁面并吐槽或發(fā)現(xiàn)bug并提交修改。
然后根據(jù)產(chǎn)品的不同,會有一個逐步上線切換的過程,比如先切5%全網(wǎng)流量,這個時候可以收集到真實的用戶數(shù)據(jù)了,這個階段性相當(dāng)于AB test,通過AB我們知道產(chǎn)品的表現(xiàn)是否達(dá)到了設(shè)計時吹的牛逼。如果牛逼能夠圓上,并且沒有出bug,那么就會逐步加碼流量直到50%-100%。淘寶有非常完善的工具鏈可以讓產(chǎn)品經(jīng)理實時地看到不同版本bucket下的PV UV 引導(dǎo)成交等指標(biāo)性數(shù)據(jù)。
不同產(chǎn)品的AB控制是不同的,有的是在web服務(wù)器層,有的是接口層,算法產(chǎn)品則更有非常完善自動化的工具鏈,可以做到新的算法開發(fā)通過驗收后瞬間發(fā)布并進行灰度?;叶葦?shù)值填寫后瞬間生效瞬間看到數(shù)據(jù)。一天多的情況下可以進行多達(dá)10輪AB test并且支持超過10個算法同時跑在線上賽馬看哪個稍微不傻逼一點。
總結(jié)下來,發(fā)布流程是這樣的:
產(chǎn)品需求收集和確定-->技術(shù)方案出具和分工協(xié)調(diào)-->開發(fā)編碼-->內(nèi)部服務(wù)器環(huán)境的測試+聯(lián)調(diào)(又名預(yù)發(fā)布環(huán)境)-->小淘寶環(huán)境發(fā)布,內(nèi)部員工噴噴噴-->小流量(具體有多小取決于業(yè)務(wù)影響面)公網(wǎng)測試-->收集數(shù)據(jù)寫反饋-->全量上線。