灰度的分類
物理灰度
新舊功能的代碼,物理隔離成兩套代碼。
對(duì)于后端,可以通過不同集群、不同接口實(shí)現(xiàn);
對(duì)于前端,可以通過不同頁面路由等方式實(shí)現(xiàn)。
邏輯灰度
新舊功能的代碼,還在同一套代碼,通過if else實(shí)現(xiàn)邏輯上的灰度
物理灰度與邏輯灰度的選擇建議
- 如果灰度時(shí)間預(yù)計(jì)會(huì)很長,建議選擇邏輯灰度,否則灰度期間,迭代內(nèi)容需要在2套代碼上進(jìn)行重復(fù)開發(fā)
- 如果代碼改動(dòng)的地方比較多,建議使用物理灰度,否則需要在很多地方加
if else,影響代碼質(zhì)量,并且后期灰度清理(刪除灰度判斷代碼和舊邏輯)工作量比較大
灰度的實(shí)現(xiàn)
場(chǎng)景1 前端根據(jù)用戶是否在灰度內(nèi),展示不同樣式
后端提供一個(gè)灰度判斷接口boolean is-gray()

場(chǎng)景2 后端使用不同集群實(shí)現(xiàn)灰度
第一次訪問頁面,前后端交互時(shí)序

第二次訪問頁面

灰度的維度
常見的灰度維度有單據(jù)、日期、品類、地區(qū)、人、機(jī)器等等,視實(shí)際項(xiàng)目情況決定。
按單據(jù)維度灰度,可以按照單據(jù)的數(shù)字規(guī)律進(jìn)行灰度,比如:
第1次灰度范圍: 單據(jù)尾號(hào)為1
第2次灰度范圍: 單據(jù)尾號(hào)為1、2
第3次灰度范圍: 單據(jù)尾號(hào)為1、2、3
...
逐步放量,最終達(dá)到100%灰度。
除了尾號(hào),還可以按取余結(jié)果、單復(fù)數(shù)等等按日期維度灰度,比如:
第1次灰度范圍: 上線當(dāng)天之后新增單據(jù)
第2次灰度范圍: 上線前1個(gè)月之后新增單據(jù)
第2次灰度范圍: 上線前3個(gè)月之后新增單據(jù)
...
最后一次灰度范圍: 全量單據(jù)涉及前端樣式改造時(shí),如果按照單據(jù)、日期、品類等維度灰度,如果同一個(gè)用戶看到的不同單子樣式不同,會(huì)造成用戶體驗(yàn)不一致
涉及前端樣式改造時(shí),如果要對(duì)列表頁灰度,除非能保證同一列表頁上的元素,都在灰度內(nèi)或者灰度外,否則就只能按人灰度,否則同一列表頁,無法展示不同樣式
需要考慮灰度規(guī)則是否有數(shù)據(jù)傾斜問題,可能理論上是均勻灰度,實(shí)際上數(shù)據(jù)傾斜嚴(yán)重。比如按單據(jù)尾號(hào)維度,尾號(hào)為1放入第1次灰度,理論上占10%,實(shí)際上數(shù)據(jù)庫統(tǒng)計(jì)結(jié)果可能占40%
按機(jī)器維度灰度,可以先把新代碼發(fā)布到1臺(tái)小流量機(jī)器(占10%入流量),停留觀察一段時(shí)間,再逐步發(fā)布其他機(jī)器
假設(shè)是對(duì)某個(gè)舊功能進(jìn)行升級(jí),按人的維度灰度時(shí),可以先撈出一些使用這個(gè)舊功能概率比較大的人群進(jìn)行灰度,避免灰度期間,沒有流量進(jìn)入改造過的代碼
假如數(shù)據(jù)模型發(fā)生了變更,那么灰度期間,新舊數(shù)據(jù)模型共存,除了對(duì)數(shù)據(jù)讀寫功能進(jìn)行灰度判斷,每次放量前,還需要進(jìn)行刷數(shù),把舊數(shù)據(jù)模型升級(jí)成新數(shù)據(jù)模型
接口轉(zhuǎn)發(fā)場(chǎng)景(http接口協(xié)議不變,舊接口轉(zhuǎn)發(fā)到新接口實(shí)現(xiàn)舊接口下線),通過網(wǎng)關(guān)配置接口轉(zhuǎn)發(fā),可以利用網(wǎng)關(guān)的灰度能力逐漸放量,比如一灰10%的流量轉(zhuǎn)發(fā)到新接口,二灰30%流量轉(zhuǎn)發(fā)到新接口...直到100%放量