仲介交易 HTTP://www.aliyun.com/zixun/aggregation/6858.html">SEO診斷 淘寶客 雲主機 技術大廳
1. 背景介紹
網站新功能或者是站內新策略開發完畢之後,在全流量上線之前要評估新功能或者新策略的優劣,常用的評估方法是A-B測試,做法是在全量中抽樣出兩份小流量,分別走新策略分支和舊策略分支,通過對比這兩份流量下的各指標的差異, 我們可以評估出新策略的優劣,進而決定新策略是否全流量。
上文中提到的抽樣是指按照某種確定的隨機化方法,對線上流量進行劃分。 抽樣可以指這種劃分的方法,也可以指劃分得到的一個流量子集。 抽樣是一種特殊的小流量,要求對流量的劃分必須保證均勻性和隨機性,並且可以根據需求過濾掉不符合規範的部分,我們把抽樣的過程分為流量切分和流量篩選兩個步驟,流量切分是指把全流量進行均勻的打散,提取出其中固定的流量比例, 流量篩選是對流量切分的輔助,篩選過程就是從切分好的流量中過濾掉不符合規範的部分,本文主要涉及的是流量切分的實現。
2. 單層流量切分架構
做到流量切分的常用的方法是單層流量切分,流量切分需要以某種方式進行,即流量切分的打散依據,例如,我們可以依據流量中的cookie打散,或者是隨機打散等,打散的方式不同,切分的物件全集也就不同了, 如果我們依據cookie打散,那麼我們的切分物件全集就是所有的cookie,如果是隨機打散,那麼我們的切分物件全集就是該網站的所有的流量。
圖1.1 單層流量切分架構示意圖
有了上面的想法,我們如何實現單層流量切分呢? 如圖1.1所示,我們按照指定的流量切分方式,將所需要的輸入參數先經過一次hash計算,產生結果的均勻性和隨機性由hash演算法來保證,有了hash產生的結果,流量切分的過程還沒有結束,我們還需要將hash結果對應到切分物件的全集上面,實現方法是 將切分物件全集看作是一個區間段,然後將hash結果對應到區間段上面,區間的大小是切分的最小細微性決定的,例如,如果需要最小切分細微性為0.01%,則我們選取的區間段為[0,9999],有了區間段的定義, 我們可以將hash結果對一個數值取模,這個數值等於區間段最大值加1,取模之後的結果可以唯一的對應到切分物件全集區間上面,這樣我們就將所有的流量打到了流量切分物件全集上面。
最後,我們再將區間段按照實驗需求細分,劃分成若干子區間,用作于實驗對比,例如下圖所示,將整個100%的區間分為多個子區間,每個子區間使用唯一的編號——sid,作為區間的唯一的標識,sid=1的子區間對應的流量為1%, 那麼它的子區間就是[0,99],同理,sid=2的第二個1%的子區間對應的區間值為[100,199],這樣我們就將一個100%的完整區間劃分成了若干個子區間,兩個比例相同的子區間就可以用作于實驗策略對比。
圖1.2 流量子區間的劃分
3. 可複用流量的多層流量切分架構
這種單層流量切分方式是一種獨佔式的流量切分方式,一個子區間只能供給一個實驗使用,一個請求只能命中一個實驗,優點是實驗之間解藕,不相互影響,缺點是資源有限,流量分配完畢之後,後續的需求將處於長期的等待與饑餓狀態, 這種獨佔式的流量切分方式,顯然在實驗需求不斷增加的情況下是完全不能滿足的,為了解決獨佔的問題,我們可以採用多層流量切分方式。
多層流量切分的思想是將單層結構擴展為多層結構,如下圖所示,多層之間必須滿足正交性,這裡多層之間的正交性是指某一層的任何一個子區間可以隨機的、均勻的對應到其他層上面, 這樣我們就把一個子區間對其他層的影響均勻的分散到整個層上面。
多層流量切分架構可以將實驗流量從100%擴展到100%*n,也就說每層中的流量我們都可以用做于實驗對比,一次請求可以同時命中多個實驗,實驗流量是複用的,多層流量是滿足不同層的實驗之間的影響都是均勻、可預估的, 開展多層實驗的前提是保證這種實驗間的影響是可接受的,有一些實驗是不允許任何複用,例如,展現類的實驗,如果兩個實驗各自指定了一套展現樣式範本,而從展現模組的角度來講一次請求只能展現一種樣式範本,因此, 這裡不相容的實驗只能位於同一層中。
圖1.3 多層流量切分架構示意圖
多層流量切分的另一個優勢是每一層我們可以使用不同的切分方式進行,這樣也極大的豐富了流量切分的多樣性,那麼,還有另一個問題,每一個流量層中只能採用一種流量切分方式,如果同一層中有多種切分方式的需求又如何解決呢? 答案是通過層的嵌套來實現,層的嵌套是指在一個層中可以包含其他的層,如下圖所示,矩形展示層,圓形表示切分出來的實驗流量,其中,1號層包含了2、3、4三個層,4號層又包含9、10、11三個層, 為了達到同一層內多種流量切分方式的目的,我們需要將該層切分成多個區間,例如,下圖中的2號層就被分成了5、6兩個層,但是這兩個層也必須採用相同的切分方式,因為這兩個層相當於把其父層的流量分成了兩部分, 因而這兩部分的產生方式應該是一致的,最後,在5、6層中,我們又可以建立其他的層,這兩個層就可以採用不同的流量切分方式了。
圖1.4 流量切分多層嵌套示意圖
理論上,多層流量切分架構的可切分層數是無限的,可以支援任意多的流量層,但是,從實現的角度來講,層數做到無限是很難實現的,因為,為了保證層和層之間的正交性,我們必須要為每一層實現一套hash演算法, 保證每種hash演算法的結果是正交的,要實現層數的無限,則需要實現無限多個保證正交的hash演算法,hash演算法的增多勢必會導致正交性的下降,我們可以實現有限個正交的hash演算法, hash演算法的數目是要求可以滿足所有的實驗需求的。 下面我們介紹一種多層流量切分架構的實現方法。
為了實現多層流量切分,我們的思路是先實現一種hash演算法,這種hash演算法的輸入是cookie、隨機值等資訊,輸出是單次hash的結果,並且保證這種hash演算法結果足夠的均勻和隨機,然後將這種hash進行變換, 擴展出多個正交的hash演算法。
為了驗證單個hash演算法的隨機性和均勻性,我們進行了實驗驗證,如下圖所示,每一行表示一個100%的全集,每一清單示從全集中抽取出10%,測試的全集是100w,從下面的測試資料來看,每個層中的流量切分結果是比較均勻和隨機的。
圖1.5 單hash演算法均勻性、隨機性驗證實驗資料
有了單層hash演算法,我們需要將單層hash擴展成為多層,這裡可以採用的方法很多,本文采用的是移位變換的方法將單層hash擴展成為多層hash,多層實驗流量切分的真實環境測試資料如下文所示。
4. 實際資料測試
為了驗證其演算法的可行性,我們進行了實際資料測試,測試結果如下:
表1.2 均勻性驗證資料
by yangfangwei&huangjin&yaoshiyu