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,也就说每层中的流量我们都可以用做于实验对比,一次请求可以同时命中多个实验,实验流量是复用的,多层流量是满足不合层的实验之间的影响都是平均、可预估的,展开多层实验的前提是包管这种实验间的影响是可接管的,有一些实验是不允许任何复用,例如,展现类的实验,如果两个实验各自指定了一套展现样式模板,而从展现模块的角度来讲一次请求只能展现一种样式模板,因此,这里不兼容的实验只能位于同一层中。