ABTest系統(tǒng)背景
互聯(lián)網(wǎng)與傳統(tǒng)軟件行業(yè)的開發(fā)最大區(qū)別就是快速迭代,新增一個業(yè)務(wù)或者新增一個基于老業(yè)務(wù)的算法更新也許只是某個工程師一天的結(jié)果禀晓。在這種代碼高速發(fā)布過程中, 必然存在結(jié)果和期望符合的情況,也存在不怎么符合的情況, 當(dāng)然更多的是存在結(jié)果與期望不相符的情況。正是由于這個原因, 小流量上線測試是比較合理的上線方法, 上線之后必須對這份測試流量進行效果追蹤,根據(jù)追蹤效果做出后續(xù)決定,是繼續(xù)加大流量呢,還是保持觀察,或者是回滾代碼。所有上述操作需要有一個系統(tǒng)輔助高效地解決,我理解的AbTest系統(tǒng)就是基于上述需求產(chǎn)生的巷懈。
我做ABTest的背景介紹
我所在的團隊是搜索業(yè)務(wù)團隊,簡而言之就是把搜索引擎的匹配結(jié)果和算法的排序結(jié)果通過產(chǎn)品經(jīng)理的意愿呈現(xiàn)給用戶,當(dāng)然除了這個基本業(yè)務(wù)還有一些和搜索相關(guān)的小業(yè)務(wù),比如搜索提示,導(dǎo)航,相關(guān)詞推薦等椅贱。
我在接上述業(yè)務(wù)需求的時候,可以歸納成以下兩個維度的需求:
- 產(chǎn)品經(jīng)理提出的需求一般會從業(yè)務(wù)層面上對比效果(比如搜索提示新功能上線后對搜索的影響 )
- 算法層面上的效果對比(還是上面這個例子, 搜索提示功能分流量上線之后,后面有其他人需要優(yōu)化搜索提示算法别瞭,那么算法工程師就需要對比這兩種算法的效果)
為了滿足產(chǎn)品經(jīng)理和算法工程師快速切換功能,快速看到效果,ABTest系統(tǒng)就開始逐步規(guī)劃了窿祥。
設(shè)計故事
我以搜索提示ABTest舉例,解釋整個ABTest系統(tǒng)工作流程。我一開始接觸搜索業(yè)務(wù)時,搜索的功能就是接受關(guān)鍵詞,結(jié)果是匹配關(guān)鍵詞的商品蝙寨∩柜茫基本業(yè)務(wù)如下圖表示,方框表示功能模塊走的流量范圍,此時表示沒有分流量測試全部走搜索基本業(yè)務(wù)号胚。
按照上一節(jié)的場景,搜索提示功能出現(xiàn)了,搜索提示功能即對用戶輸入做智能補全。用戶可以點擊提示的候選詞列表,進行搜索流程最終展現(xiàn)結(jié)果浸遗。這個時候產(chǎn)品經(jīng)理的需求是50%流量走搜索提示測試,其余保持原狀。下面先簡單介紹下分流量的問題箱亿。
分流量簡單介紹
分流量原則上需要保證均勻性和一致性跛锌。均勻性指的是流量唯一標識符取摸后均勻地落在每個區(qū)間。舉個例子,使用cookid通過標識符生成算法模塊生成一個唯一標識符(uuid),我對全站流量分成100份,那么uuid%100的值0~99,必須做到每個值分配的流量幾乎相同届惋。一致性指的是某個流量生成uuid后再取摸的值是一定的,比如某個cookid經(jīng)過算法模塊后取摸的值為1,那么下次再次經(jīng)過uuid生成算法取摸后值還是為1髓帽。大家可以百度一下保證這兩個特性的算法。
根據(jù)50%的流量分法,我給出如下示意圖脑豹。
50%使用搜索的用戶會有搜索提示這個功能,其余只能直接搜商品郑藏。這個層次結(jié)構(gòu)正好解決了搜索提示分流量上線的需求。效果追蹤穩(wěn)定后,搜索提示改造算法出現(xiàn)了,我會在原先結(jié)構(gòu)上新增一份對比測試流量瘩欺。
當(dāng)然故事會繼續(xù),產(chǎn)品經(jīng)理認為搜索提示這個功能可以全量上線,那么此時劃分結(jié)構(gòu)會按原來的比例擴展并覆蓋原先非測試的流量必盖。
如果我的業(yè)務(wù)只有一個功能做AB測試,以上流程就可以解決了。但是業(yè)務(wù)工程師必須要多想一下,萬一在原來的場景下又多一種分流量測試怎么辦?我不可能停止搜索提示測試吧俱饿。支持多種類型測試的ABTest系統(tǒng),最重要的是各個類型實驗之間互不干擾歌粥。 對于上面提到的搜索商品基本業(yè)務(wù),算法工程師提出優(yōu)化原來的排序算法,需要接入1/3的搜索流量, ABTest系統(tǒng)流量劃分示意圖如下所示。按照這個流量劃分思路會引來一個問題,搜索排序A的流量全部來自搜索提示A,搜索排序B的流量大部分來自搜索提示小部分來自搜索提示A拍埠。搜索提示算法對搜商品排序算法影響是不均勻的失驶。我的解決方法是對實驗類型分層編號,uuid生成方法為根據(jù)(cookid,layerid)生成。這樣每一層的實驗類型不管有多少個實驗對其他層實驗的影響都是均勻的枣购。此時搜商品排序A和搜商品排序B都有來自搜索提示AB的流量嬉探。
到這里為止,ABTest系統(tǒng)通過分層結(jié)構(gòu)已經(jīng)可以滿足任意種類的AB測試。我把這個想法和算法組老大溝通后,他基本也是滿意的,只是提出了還有一種獨占性流量測試需求,比如我劃一個區(qū)域搜商品排序A只能來自搜索提示A,其他的還是按原先流程進行棉圈。那么現(xiàn)在就需要引入域的概念,我對域的理解是一個流量劃分,域中會有不同類型的實驗涩堤。我給出一些包含域的分層實驗示意圖,讀者看完后應(yīng)該會有所理解。左上角圖中有三個域,最外層的域中包含兩個子域,每個子域中有實驗層分瘾。右上角圖中也包含三個域,其中左邊域中有三個實驗定躏。域和域的流量是互不干擾的,比如左上角圖中的搜索提示A的實驗流量不會作用于搜商品排序B。同個域中的流量分配規(guī)則和沒有引入域的分層實驗規(guī)則一致芹敌。
實現(xiàn)方法
我的實現(xiàn)方法是把上述示意圖抽象成一棵多叉樹,節(jié)點是域和實驗層的列表痊远。為了更加通用化解釋,我給出一個較為復(fù)雜的流量劃分示意圖。父節(jié)點的流量范圍是0-100,這個域中有兩個實驗層和兩個實驗域,層下面是實驗,域下面還有子域氏捞。業(yè)務(wù)接入方可以根據(jù)cookid和層id(這個有ABTest系統(tǒng)給出)通過遍歷這棵樹,獲取正在測試的實驗配置碧聪。
總結(jié)
以上設(shè)計流程參考google 的ABTest分層實驗?zāi)P?那篇文章講述過于抽象,我按照自己碰到的問題結(jié)合模型敘述了一遍。讀者在理解的時候肯定會遇到些問題,可以評論留言,我在這里只是做簡單的分享液茎。
后續(xù)系統(tǒng)規(guī)劃
本文所說的流量劃分方法是按uuid均勻劃分,未來的劃分方式會有更多樣化,比如按興趣愛好分,按地域分等等逞姿。這些劃分方法也是可以集成到ABTest系統(tǒng)中,業(yè)務(wù)方可以調(diào)用類似DivideBy...這樣的API調(diào)用獲取ABTest實驗數(shù)據(jù)辞嗡。當(dāng)然還有效果實時統(tǒng)計,最終當(dāng)然是ABTest上線之后立馬能看出結(jié)果。
我的思考
工作2快兩年了,漸漸開始領(lǐng)悟做業(yè)務(wù)開發(fā)的含義滞造。剛畢業(yè)那會(應(yīng)該大部分同學(xué)剛畢業(yè)的時候),多多少少都懷揣著干高端技術(shù),實現(xiàn)偉大碼農(nóng)夢的理想续室。比如一個引擎優(yōu)化提升多少性能,一個算法gmv翻倍的各種yy想法,然而做業(yè)務(wù)技術(shù)總讓人覺得很low,就是臟活累活。現(xiàn)在來看,做業(yè)務(wù)確實充斥著各種臟活累活,但是需要思考的是為什么會有這么多臟活累活?這些臟活累活是不是可以用一些專業(yè)的系統(tǒng)去解決谒养,像上面講的ABTest系統(tǒng)就是對分流量測試的一個通用抽象系統(tǒng)挺狰。那么其他活我們是不是也能創(chuàng)造一些系統(tǒng)去解決呢?因此我定義業(yè)務(wù)開發(fā)工程師從技術(shù)的角度應(yīng)該稱作系統(tǒng)開發(fā)工程師,但是系統(tǒng)的形成必須解決現(xiàn)實中的存在的各種相似的業(yè)務(wù)需求,否則不能解決問題的系統(tǒng)就是個裝逼系統(tǒng)吧买窟。我現(xiàn)階段的結(jié)論,一名優(yōu)秀的系統(tǒng)開發(fā)工程師,從業(yè)務(wù)層面上必須要了解需求,抽象需求,并且又得滿足可能擴展的需求;從技術(shù)層面上必須要會用各種解決問題的技術(shù),不需要要了解得多深入,至少要知道怎么用丰泊。