互聯(lián)網(wǎng)AbTest系統(tǒng)設(shè)計思考

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ù)号胚。

全流量走搜商品業(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%流量上線

50%使用搜索的用戶會有搜索提示這個功能,其余只能直接搜商品郑藏。這個層次結(jié)構(gòu)正好解決了搜索提示分流量上線的需求。效果追蹤穩(wěn)定后,搜索提示改造算法出現(xiàn)了,我會在原先結(jié)構(gòu)上新增一份對比測試流量瘩欺。

兩種搜索提示算法各占原先測試流量的一半

當(dāng)然故事會繼續(xù),產(chǎn)品經(jīng)理認為搜索提示這個功能可以全量上線,那么此時劃分結(jié)構(gòu)會按原來的比例擴展并覆蓋原先非測試的流量必盖。

搜索提示功能全量上線并且保持搜索提示算法AB測試.png

如果我的業(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的流量嬉探。

1/3流量走搜商品排序A,其余走搜商品排序B

到這里為止,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)給出)通過遍歷這棵樹,獲取正在測試的實驗配置碧聪。

比較通用的ABTest流量劃分圖.png
搜索提示ABTest數(shù)據(jù)結(jié)構(gòu).png

總結(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ù),不需要要了解得多深入,至少要知道怎么用丰泊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市始绍,隨后出現(xiàn)的幾起案子瞳购,更是在濱河造成了極大的恐慌,老刑警劉巖亏推,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件学赛,死亡現(xiàn)場離奇詭異,居然都是意外死亡吞杭,警方通過查閱死者的電腦和手機罢屈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篇亭,“玉大人缠捌,你說我怎么就攤上這事∫氲伲” “怎么了曼月?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柔昼。 經(jīng)常有香客問我哑芹,道長,這世上最難降的妖魔是什么捕透? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任聪姿,我火速辦了婚禮,結(jié)果婚禮上乙嘀,老公的妹妹穿的比我還像新娘末购。我一直安慰自己,他們只是感情好虎谢,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布盟榴。 她就那樣靜靜地躺著,像睡著了一般婴噩。 火紅的嫁衣襯著肌膚如雪擎场。 梳的紋絲不亂的頭發(fā)上羽德,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音迅办,去河邊找鬼宅静。 笑死,一個胖子當(dāng)著我的面吹牛站欺,可吹牛的內(nèi)容都是我干的姨夹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼镊绪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洒忧?” 一聲冷哼從身側(cè)響起蝴韭,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熙侍,沒想到半個月后榄鉴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡蛉抓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年庆尘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巷送。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡驶忌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笑跛,到底是詐尸還是另有隱情付魔,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布飞蹂,位于F島的核電站几苍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陈哑。R本人自食惡果不足惜妻坝,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惊窖。 院中可真熱鬧刽宪,春花似錦、人聲如沸界酒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盾计。三九已至售担,卻和暖如春赁遗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背族铆。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工岩四, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哥攘。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓剖煌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逝淹。 傳聞我的和親對象是個殘疾皇子耕姊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容