基于hash计算的多层实验流量切分的实现

1.      背景介绍

         站点新功能或者是站内新策略开发完毕以后,在全流量上线以前要评估新功能或者新策略的优劣,经常使用的评估方法是A-B测试,作法是在全量中抽样出两份小流量,分别走新策略分支和旧策略分支,经过对比这两份流量下的各指标的差别,咱们能够评估出新策略的优劣,进而决定新策略是否全流量。算法

         上文中提到的抽样是指按照某种肯定的随机化方法,对线上流量进行划分。抽样能够指这种划分的方法,也能够指划分获得的一个流量子集。抽样是一种特殊的小流量,要求对流量的划分必须保证均匀性和随机性,而且能够根据需求过滤掉不符合规范的部分,咱们把抽样的过程分为流量切分和流量筛选两个步骤,流量切分是指把全流量进行均匀的打散,提取出其中固定的流量比例,流量筛选是对流量切分的辅助,筛选过程就是从切分好的流量中过滤掉不符合规范的部分,本文主要涉及的是流量切分的实现。cookie

 

2.      单层流量切分架构

         作到流量切分的经常使用的方法是单层流量切分,流量切分须要以某种方式进行,即流量切分的打散依据,例如,咱们能够依据流量中的cookie打散,或者是随机打散等,打散的方式不一样,切分的对象全集也就不一样了,若是咱们依据cookie打散,那么咱们的切分对象全集就是全部的cookie,若是是随机打散,那么咱们的切分对象全集就是该站点的全部的流量。架构

图1.1 单层流量切分架构示意图ide

         有了上面的想法,咱们如何实现单层流量切分呢?如图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.      可复用流量的多层流量切分架构

         这种单层流量切分方式是一种独占式的流量切分方式,一个子区间只能供给一个实验使用,一个请求只能命中一个实验,优势是实验之间解藕,不相互影响,缺点是资源有限,流量分配完毕以后,后续的需求将处于长期的等待与饥饿状态,这种独占式的流量切分方式,显然在实验需求不断增长的状况下是彻底不能知足的,为了解决独占的问题,咱们能够采用多层流量切分方式。开发

         多层流量切分的思想是将单层结构扩展为多层结构,以下图所示,多层之间必须知足正交性,这里多层之间的正交性是指某一层的任何一个子区间能够随机的、均匀的对应到其余层上面,这样咱们就把一个子区间对其余层的影响均匀的分散到整个层上面。hash

         多层流量切分架构能够将实验流量从100%扩展到100%*n,也就说每层中的流量咱们均可以用作于实验对比,一次请求能够同时命中多个实验,实验流量是复用的,多层流量是知足不一样层的实验之间的影响都是均匀、可预估的,开展多层实验的前提是保证这种实验间的影响是可接受的,有一些实验是不容许任何复用,例如,展示类的实验,若是两个实验各自指定了一套展示样式模板,而从展示模块的角度来说一次请求只能展示一种样式模板,所以,这里不兼容的实验只能位于同一层中。it

图1.3 多层流量切分架构示意图

         多层流量切分的另外一个优点是每一层咱们可使用不一样的切分方式进行,这样也极大的丰富了流量切分的多样性,那么,还有另外一个问题,每个流量层中只能采用一种流量切分方式,若是同一层中有多种切分方式的需求又如何解决呢?答案是经过层的嵌套来实现,层的嵌套是指在一个层中能够包含其余的层,以下图所示,矩形表示层,圆形表示切分出来的实验流量,其中,1号层包含了二、三、4三个层,4号层又包含九、十、11三个层,为了达到同一层内多种流量切分方式的目的,咱们须要将该层切分红多个区间,例如,下图中的2号层就被分红了五、6两个层,可是这两个层也必须采用相同的切分方式,由于这两个层至关于把其父层的流量分红了两部分,于是这两部分的产生方式应该是一致的,最后,在五、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

相关文章
相关标签/搜索