
2. 在線(xiàn)服務(wù)系統(tǒng)
Tesla以lib庫(kù)的方式接入在線(xiàn)服務(wù)系統(tǒng)。沒(méi)有做成一個(gè)服務(wù)的形式,主要考慮到接入簡(jiǎn)單,不增加系統(tǒng)復(fù)雜性和運(yùn)維的工作量。
(1) 分流規(guī)則。用戶(hù)可以在各層指定不同的切分標(biāo)記進(jìn)行流量切分。系統(tǒng)會(huì)根據(jù)用戶(hù)指定的切分標(biāo)記值來(lái)計(jì)算hash值。計(jì)算出的hash值對(duì)100取模再加1可以得到分桶號(hào),每個(gè)實(shí)驗(yàn)占了指定范圍的桶號(hào),這樣便可以知道該次請(qǐng)求應(yīng)當(dāng)進(jìn)行哪個(gè)實(shí)驗(yàn)。這里需要注意的是,選取一個(gè)偏差較小的hash函數(shù),我們?cè)跀?shù)10種hash函數(shù)中選取了一個(gè)最優(yōu)的hash函數(shù),將偏差控制在實(shí)驗(yàn)效果統(tǒng)計(jì)可以忽略的范圍。
假如每一層均使用這樣的切分規(guī)則,不同層做實(shí)驗(yàn)的用戶(hù)選用相同切分規(guī)則時(shí),請(qǐng)求始終落入相同的桶。由于不同層的實(shí)驗(yàn)之間毫無(wú)關(guān)系,為了保證實(shí)驗(yàn)效果絕對(duì)可信,需要做到不同層的流量正交。為了達(dá)到這個(gè)目的,引入了layerID來(lái)作為離散因子。由于每一層layerID是固定的,也能保證同一請(qǐng)求兩次訪問(wèn)能落到同一個(gè)實(shí)驗(yàn),從而不會(huì)造成同一用戶(hù)多次訪問(wèn),返回結(jié)果不一致的困惑。示意圖如下。

(2) 實(shí)驗(yàn)參數(shù)的處理。之前講述了如何決定一次請(qǐng)求去作哪些實(shí)驗(yàn)。這一部分介紹一個(gè)具體實(shí)驗(yàn)的構(gòu)成元素,以及系統(tǒng)如何執(zhí)行實(shí)驗(yàn)。一個(gè)實(shí)驗(yàn)本質(zhì)上是一堆抽象參數(shù)集合。每個(gè)請(qǐng)求被分配某個(gè)實(shí)驗(yàn)之后,系統(tǒng)便會(huì)將該實(shí)驗(yàn)的抽象參數(shù)集合,作為請(qǐng)求的一部分傳遞至在線(xiàn)服務(wù)系統(tǒng)的各個(gè)處理模塊。
對(duì)于系統(tǒng)而言,可以根據(jù)請(qǐng)求攜帶的參數(shù)值來(lái)決定作哪個(gè)實(shí)驗(yàn)。這里需要注意的是,為了保證系統(tǒng)的健壯性,如果一個(gè)請(qǐng)求缺少了某個(gè)實(shí)驗(yàn)參數(shù)的數(shù)值,系統(tǒng)應(yīng)該設(shè)置一個(gè)抄底的值。
(3) 實(shí)驗(yàn)發(fā)布。當(dāng)某個(gè)實(shí)驗(yàn)效果非常好時(shí),可以動(dòng)態(tài)調(diào)整該實(shí)驗(yàn)的流量占比,從而迅速得到收益,并且在大流量上驗(yàn)證該實(shí)驗(yàn)的有效性。一旦確認(rèn)該實(shí)驗(yàn)效果非常良好,便可以在全流量上線(xiàn)。這時(shí)需要?jiǎng)h除該實(shí)驗(yàn),把該實(shí)驗(yàn)的參數(shù)作用于全部的流量。這是通過(guò)在每個(gè)場(chǎng)景中設(shè)置一個(gè)初始化層來(lái)實(shí)現(xiàn)的。
每個(gè)場(chǎng)景的第一層設(shè)定為初始化層,該層會(huì)初始化需要作用于全流量的所有參數(shù)。一旦某個(gè)實(shí)驗(yàn)需要在全流量上線(xiàn),便可以刪除該實(shí)驗(yàn),將該實(shí)驗(yàn)的參數(shù)移到初始化層去。這樣便可以避免實(shí)驗(yàn)數(shù)量不斷膨脹、層數(shù)不斷增加的問(wèn)題,同時(shí)也達(dá)到了在線(xiàn)全流量發(fā)布某個(gè)實(shí)驗(yàn)的目的。
3.日志分析展示系統(tǒng)
實(shí)驗(yàn)效果統(tǒng)計(jì)無(wú)疑是系統(tǒng)中非常重要的一個(gè)環(huán)節(jié)。對(duì)于簡(jiǎn)單的AB-test(物理集群隔離的實(shí)驗(yàn)方法),實(shí)驗(yàn)數(shù)據(jù)的統(tǒng)計(jì)相對(duì)比較容易。對(duì)于這種復(fù)用流量,在一次請(qǐng)求上作多個(gè)實(shí)驗(yàn)的方式,統(tǒng)計(jì)實(shí)驗(yàn)效果相對(duì)要復(fù)雜一些。這里介紹一種相對(duì)簡(jiǎn)單的實(shí)驗(yàn)統(tǒng)計(jì)分析方法。每個(gè)實(shí)驗(yàn)均有一個(gè)唯一的實(shí)驗(yàn)ID。對(duì)于一次請(qǐng)求,調(diào)用分流庫(kù)后,在返回所有實(shí)驗(yàn)參數(shù)的同時(shí),會(huì)返回一個(gè)字符串,該字符串將所有作用于該次請(qǐng)求的實(shí)驗(yàn)ID以下劃線(xiàn)連接起來(lái),例如Exp1_Exp3_Exp6_Exp8_Exp9。請(qǐng)求同樣會(huì)把這個(gè)字符串?dāng)y帶傳輸至系統(tǒng)的各個(gè)模塊,在記錄系統(tǒng)日志時(shí)將該字符串一并記錄下來(lái)。
日志分析處理模塊以“_”為分割符把該字符串進(jìn)行分割,得到多個(gè)實(shí)驗(yàn)ID,利用storm等流式實(shí)時(shí)處理系統(tǒng)去實(shí)時(shí)統(tǒng)計(jì)分析各個(gè)實(shí)驗(yàn)的效果,再利用實(shí)驗(yàn)發(fā)布系統(tǒng)動(dòng)態(tài)調(diào)整流量,從而獲得了文中提出的一種良性的閉環(huán)反饋。
應(yīng)用實(shí)例
下面以一個(gè)簡(jiǎn)單的廣告引擎系統(tǒng)接入上述平臺(tái)的例子,具體說(shuō)明上述的方法。該系統(tǒng)共有兩個(gè)實(shí)驗(yàn)點(diǎn)(Query Rewrite和Rank),因此可以分為兩層實(shí)驗(yàn)。下面以一次請(qǐng)求的處理流程來(lái)簡(jiǎn)單說(shuō)明該引擎系統(tǒng)的工作原理。

如上圖所示,Tesla以lib庫(kù)的形式接入引擎中。引擎接收到請(qǐng)求后,調(diào)用Tesla的lib庫(kù)獲取對(duì)應(yīng)的實(shí)驗(yàn)參數(shù)信息,然后依次將實(shí)驗(yàn)信息透?jìng)鹘oQuery Rewrite和Rank。在Query Rewrite和Rank模塊中各取所需實(shí)驗(yàn)參數(shù)進(jìn)行相應(yīng)的實(shí)驗(yàn),最后將bucketID記錄到投放日志對(duì)應(yīng)的字段中,用于實(shí)驗(yàn)效果統(tǒng)計(jì)用。