一、什麼是灰度釋出?
要想了解這個問題就要先明白什麼是灰度。灰度從字面意思理解就是存在於黑與白之間的一個平滑過渡的區域,所以說對於網際網路產品來說,上線和未上線就是黑與白之分,而實現未上線功能平穩過渡的一種方式就叫做灰度釋出。
非黑即白從來不是一種普遍現象,從色彩角度講,灰度指不飽和的黑色,我們把黑色定為基準色,每個灰度物件是從白色(0%)到黑色(100%)的中間值,這中間的98%都是灰。
二、灰度釋出的機制?
可以通過很多種形式來抽取一部分使用者,比如說選擇自己的VIP使用者,或者選擇一些活躍使用者,把這些使用者分成兩批,其中一批投放A版本,另外一批投放B版本,在投放之前就要對各種可能存在的資料做到收集記錄工作,這樣才能在投放以後檢視兩個版本的使用者資料反饋,通過大量的資料分析以及調查來確定最後使用哪一個版本來進行投放。
一套完整的灰度釋出機制會包括下面這些階段:
使用者標識:主要是區分使用者,同時也為資料分析做輔助。
目標使用者/流量篩選:需要參考使用者特徵、使用者流量、使用者範圍及使用者體驗的一致性,版本迭代針對全部使用者還是部分使用者,小流量試驗通過再放量,一般來說按照內部使用者-種子使用者-活躍使用者-所有使用者的順序就是一種典型的範圍控制,體驗一致性要求考慮新舊版本的跨度是否過大,使用者能否接受。
實時資料監控:監測諸如新版本穩定性、伺服器穩定性、使用次數、使用頻率等資料與原有資料對比。
一鍵釋出/回滾:從資料反饋結果決定是否釋出/回滾。
下圖是阿里軟體的釋出引擎,支援灰度交付。
三,涉及到資料庫變更,如何支援灰度?
假設灰度的服務,需要使用到資料庫,如果灰度前後資料庫的欄位保持不變,那麼新舊兩套系統使用同一套資料庫就可以了.
如果前後資料不一致,需要處理的情況就比較複雜,分為以下幾種情況.
- 部分灰度
在部分灰度的情況下,有部分請求到舊系統上,另一部分請求到了新的灰度系統上.走到舊系統的請求,還是照原樣處理.但是走到了新版灰度系統的請求,需要同時將請求轉發給舊系統上來對應的介面上修改舊系統的資料.如果走到新系統的請求查不到該使用者的資料,還需要首先同步一份來新系統上.如果是事務性的請求,以寫入老系統成功來做為操作成功的標準.
- 全部灰度
在灰度系統已經全部接管了線上流量之後,為了安全起見,仍然需要對新老系統進行雙寫,步驟和前面一樣.
- 灰度完成
灰度完成與前面的全量灰度狀態不太一樣,區別在於前面的全量灰度狀態下,仍然不能肯定系統一定是沒有問題的,所以需要進行新舊系統的雙寫來保證資料可以在老系統上進行回滾.而在灰度完成狀態,此時認為這個新版本已經完全通過了驗證,無需再寫入舊系統了.但是此時可能存在部分在灰度期間沒有上線的使用者,此時需要做一次同步,從舊系統上將這部分資料同步過來.
可以看到,這三個狀態下,對新舊系統是否進行雙寫,做了嚴格的區分,目的只有一個:一旦新上線的系統出現問題,可以馬上撤掉灰度系統,而這期間使用者的任何修改在舊系統上都是可以找到的.
四、總結
有人質疑灰度釋出是一種浪費。但與其說這是浪費不如說是冗餘和彈性,灰度釋出能避免新版本全量上線的風險,通過小流量驗證的方式,在灰度階段就能發現、調整並優化產品中的問題,平滑迭代。同時還要對所有的相關資料進行收集工作,比如新版本的穩定性,伺服器的穩定性以及使用次數,使用頻率以及各種資料,方便和以前的原有資料進行對比。
也許有人會覺得灰度釋出完全沒有必要,是一種資源的浪費,其中灰度釋出是非常有用的,這樣做的目地不但能瞭解最真實的使用者體驗同時還可以有效的防止重大BUG產生影響系統回檔或者造成其他更多不必要的經濟損失,所以說灰度釋出是有效避免新版本上線風險的一種有效辦法,可以通過小流量來先進行測試工作,幫助新版本完成平滑迭代。