簡(jiǎn)單的前端灰度發(fā)布方案

基本概念

灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間,能夠平滑過(guò)渡的一種發(fā)布方式。在其上可以進(jìn)行A/B testing,即讓一部分用戶繼續(xù)用產(chǎn)品特性A,一部分用戶開始用產(chǎn)品特性B,如果用戶對(duì)B沒(méi)有什么反對(duì)意見,那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面來(lái)?;叶劝l(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問(wèn)題,以保證其影響度。

實(shí)現(xiàn)思路

灰度發(fā)布的核心就是分流,一部分用戶能看到,一部分用戶看不到。所以主要實(shí)現(xiàn)的核心分流算法。在實(shí)現(xiàn)這個(gè)需求的時(shí)候,我想到了抽簽。比如在1-100的數(shù)字中抽到1-30的用戶進(jìn)入beta版本,抽到31-100的用戶進(jìn)入stable版本。這樣就相當(dāng)于是30%的流量進(jìn)入灰度版本。

具體實(shí)現(xiàn)

首先實(shí)現(xiàn)產(chǎn)生1-100的整數(shù)的隨機(jī)函數(shù)。

/***************************************
 * 生成從minNum到maxNum的隨機(jī)數(shù)。
 * 如果指定decimalNum個(gè)數(shù),則生成指定小數(shù)位數(shù)的隨機(jī)數(shù)
 * 如果不指定任何參數(shù),則生成0-1之間的隨機(jī)數(shù)。
 *
 * @minNum:[數(shù)據(jù)類型是Integer]生成的隨機(jī)數(shù)的最小值(minNum和maxNum可以調(diào)換位置)
 * @maxNum:[數(shù)據(jù)類型是Integer]生成的隨機(jī)數(shù)的最大值
 * @decimalNum:[數(shù)據(jù)類型是Integer]如果生成的是帶有小數(shù)的隨機(jī)數(shù),則指定隨機(jī)數(shù)的小數(shù)點(diǎn)后的位數(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();
    }
}

然后實(shí)現(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é)

至此,簡(jiǎn)單的灰度方案就做好了。在進(jìn)入頁(yè)面時(shí)先調(diào)用isShowGray函數(shù)判斷進(jìn)入哪個(gè)方案。這樣就可以做到簡(jiǎn)單的用戶分流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容