基本概念
灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式痕檬。在其上可以進行A/B testing,即讓一部分用戶繼續(xù)用產(chǎn)品特性A宦焦,一部分用戶開始用產(chǎn)品特性B咨堤,如果用戶對B沒有什么反對意見菇篡,那么逐步擴大范圍,把所有用戶都遷移到B上面來吱型∫菁郑灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)津滞、調(diào)整問題,以保證其影響度灼伤。
實現(xiàn)思路
灰度發(fā)布的核心就是分流触徐,一部分用戶能看到,一部分用戶看不到狐赡。所以主要實現(xiàn)的核心分流算法撞鹉。在實現(xiàn)這個需求的時候,我想到了抽簽颖侄。比如在1-100的數(shù)字中抽到1-30的用戶進入beta版本鸟雏,抽到31-100的用戶進入stable版本。這樣就相當(dāng)于是30%的流量進入灰度版本览祖。
具體實現(xiàn)
首先實現(xiàn)產(chǎn)生1-100的整數(shù)的隨機函數(shù)孝鹊。
/***************************************
* 生成從minNum到maxNum的隨機數(shù)。
* 如果指定decimalNum個數(shù)展蒂,則生成指定小數(shù)位數(shù)的隨機數(shù)
* 如果不指定任何參數(shù)又活,則生成0-1之間的隨機數(shù)。
*
* @minNum:[數(shù)據(jù)類型是Integer]生成的隨機數(shù)的最小值(minNum和maxNum可以調(diào)換位置)
* @maxNum:[數(shù)據(jù)類型是Integer]生成的隨機數(shù)的最大值
* @decimalNum:[數(shù)據(jù)類型是Integer]如果生成的是帶有小數(shù)的隨機數(shù)锰悼,則指定隨機數(shù)的小數(shù)點后的位數(shù)
*
****************************************/
function randomNum(maxNum, minNum, decimalNum) {
var max = 0,
min = 0;
minNum <= maxNum ? ((min = minNum), (max = maxNum)) : ((min = maxNum), (max = minNum));
switch (arguments.length) {
case 1:
return Math.floor(Math.random() * (max + 1));
case 2:
return Math.floor(Math.random() * (max - min + 1) + min);
case 3:
return (Math.random() * (max - min) + min).toFixed(decimalNum);
default:
return Math.random();
}
}
然后實現(xiàn)灰度流量的判斷
/**
* @description 灰度顯示
* @param {Number} defaultLucky 灰度值柳骄,取值范圍[0,1]
* @returns {Boolean} ture/false
*/
export function isShowGray(defaultLucky) {
if (!lucky) lucky = defaultLucky;
var num = randomNum(1, 100);
if (num <= Number(100 * lucky) && num >= 1) {
return true;
}
return false;
}
總結(jié)
至此,簡單的灰度方案就做好了箕般。在進入頁面時先調(diào)用isShowGray
函數(shù)判斷進入哪個方案耐薯。這樣就可以做到簡單的用戶分流。