在 2018 年,我相信 ABTest 这个名词已经不用过多地解释了。但我发现很多公司,尤其是初创企业,虽然能理解这件事是什么,却不知道这件事该怎么做,以及该怎么做好。

这一系列文章,就是想讲清楚在设计具体的 A/B 测试平台这种基础架构时,要考虑哪些问题,以及有哪些推荐的做法。

今天先谈一谈,如何进行用户分桶?

我们都知道互联网产品的 ABTest 主要是围绕用户进行的实验,从统计意义上观察用户对不同的产品设计、交互体验、业务流程的反馈,从而指导产品的改进方向。

那么很重要的一点就是,怎么圈定哪些用户进行 A 实验,哪些用户进行 B 实验。

在我工作过的一家公司,他们是这样做的:“使用用户的 UserID 对 1000 取模分成 1000 个桶,然后选择不同的桶分配给 A 或者 B。”

我问研发人员为什么这么做?他们给的理由是:“UserID 是自增 ID,跟用户注册顺序有关,有一定的随机性。可以保证用户随机地分到 A 或者 B 中。”

A/B 的流量圈定的一个重要原则就是无偏,不然无法进行对比评估。上面的做法看起来倒也有一定的道理。(还常见的一种做法是,用手机尾号最后一位来进行分桶,优惠多少就看你手机尾号是否运气好了 ^_^ )

单单考虑孤立实验,这样做也无可厚非。但如果考虑到长期交叉、连续的实验,这样做有很大的问题。

首先,这种设计只能进行单层实验,也就是说一份流量只能通过一个实验。

如果实验人员选择了在任意一个桶中同时进行 X, Y 两个实验的话,那两个实验的结果就会相互干涉,导致最终结果不可信。例如:在尾号为 001 的桶里进行了两个促销活动“降价10%”和“满100减10块”的实验,最终 001 桶的用户订单数比其它桶高,那到底是哪个促销更有效果呢?

其次,这种设计在长期会造成桶间用户行为有偏。

也许刚开始因为其随机性,桶间用户行为差异很小。但第一个实验过后,桶间就开始有了行为差异——这也是 ABTest 的目标。N 个实验过后,桶间行为的差异可能就变得非常大了。

比如你总是在 001 桶的用户上实验幅度较大的促销活动,那么 001 桶的用户留存就会显著高于其它桶。那实验人员为了让实验效果更好看,可能会偷偷地继续选择 001 桶进行实验。

第三,这种设计的实验效率太低。因为一份流量只能通过一个实验,无法对流量进行充分的利用。

那该如何设计用户分桶,才能满足 ABTest 的需求呢?

目前业界应用最多的,是可重叠分层分桶方法。

具体来说,就是将流量分成可重叠的多个层。因为很多类实验从修改的系统参数到观察的产品指标都是不相关的,完全可以将实验分成互相独立的多个层。例如 UI 层、推荐算法层、广告算法层,或者开屏、首页、购物车、结算页等。

单单分层还不够,在每个层中需要使用不同的随机分桶算法,保证流量在不同层中是正交的。也就是说,一个用户在每个层中应该分到哪个桶里,是独立不相关的。具体来说,在上一层 001 桶的所有用户,理论上应该均匀地随机分布在下一层的 1000 个桶中。

通过可重叠的分层分桶方法,一份流量通过 N 个层可以同时中 N 个实验,而且实验之间相互不干扰,能显著提升流量利用率。

从实操上来说,我们通常采取下面的方法:

首先,确定 Layer,确定请求 Tag。例如从 UserID,DeviceID、CookieID、手机号 中选一个,支持匿名流量的,一般会选用 DeviceID 或者 IMSI 等作为请求 Tag。

然后,选一个你喜欢的 Hash 函数,尽量选个使用方便、随机性更强的;

最后,通过 Hash(Layer, Tag) % 1000 确定每层分桶。如果 Hash 函数支持 seed,那么使用 Layer 作为 seed,否则作为 SALT,即将 "Layer+Tag" 作为输入参数。

在完成分桶以后,还可以进行一定的流量筛选。例如来自北京和上海的用户,可以允许分别进行不同的实验。

可重叠分层分桶方法的系统性介绍,可以参见 Google 在 KDD 2010 发表的论文 《Overlapping Experiment Infrastructure: More, Better, Faster Experimentation》,感兴趣的同学可以延伸阅读一下。

但分层方法并不能让所有人满意,尤其是对并行实验非常多的大公司来说。因为同一层可能有不同份额的其它小流量实验在线上,新实验能够拿到的流量非常有限,需要等待同层其它实验结束,会非常影响迭代效率。而新实验未必一定会修改其它实验的参数,或者影响其它实验的效果。

所以一些公司也逐渐开始探索无分层,也可以称为无限分层的方法。具体的做法是,每个实验都可以看成独立的层,只保证层间流量分桶的正交性,所有的实验都可能存在重叠情况。

这样做用户就有大概率同时中同一类实验,例如两个实验人员同时在实验 UI 布局,实际上用户只能看到一种布局(因为代码分支有先后逻辑),那么实验结果就不可信了。

由于系统上无法保证实验间不冲突,那么只能从组织上来避免冲突,或者从数据上尽早观察到冲突的存在来解决冲突。这对组织的管理能力和企业的数据能力提出了更高的要求。

下篇,我们聊一下实验的开关和分组信息传递。

首发于本人原创个人博客:

ABTest 平台设计 - 如何进行流量分桶​yangwenbo.com

平台如何限制ip流量_ABTest 平台设计 - 如何进行流量分桶相关推荐

  1. java web 流量统计_网站流量统计的设计与实现

    摘要 随着因特网的迅猛发展,网络变得越来越普遍,但结构却越来越复杂,而且现在涌现出大量的各种各样网络的应用.硬件.平台和协议,各个企业或部门不得不投入一个或多个网络管理者去维护和控制其网络.如何能将网 ...

  2. 亿级流量实验平台设计与实践

    关注公众号[高性能架构探索],后台回复[pdf],免费获取计算机必备经典书籍 大家好,我是虫爸.今天给大家分享一款亿级流量实验平台. 在互联网行业,要上线一个策略(CTR预估.CVR预估等),或者一个 ...

  3. android流量监控软件设计与实现,基于android平台的流量监控系统的设计与实现

    摘要: 为了解决流量超额使用,恶意流量吸费的非法插件以及软件恶意联网的问题,帮助用户安全放心使用手机,本文设计并实现了一款基于Android平台的流量监控系统. 本文以Android系统为平台,分别从 ...

  4. 《近匠》专访Ayla Networks云平台工程部主管——企业级物联网云平台的设计与部署...

    随着智能设备的普及以及硬件成本的下降,物联网(IoT)领域已成为当下热门的"新战场".据IDC研究表明,尽管有66%的元器件厂商和67%的加工厂商正在积极探索物联网领域,但其中只有 ...

  5. 开源物联网平台ThingsBoard数据库40张数据表设计一览

    开源物联网平台ThingsBoard数据库40张数据表设计一览 1 ThingsBoard数据库总览 1.1 数据库信息 1.1.1 数据库名称 1.1.3 数据库用户名及密码 1.1.3 数据库表 ...

  6. 流量分析平台之(流影)扩展解决方案

    https://abyssalfish-os.github.io 背景: 首个开源网络流量可视化分析平台 问题: 流影只对 命中 特征规则 单包进行了留存.能留存netflow形式的流量会话日志但没有 ...

  7. java化测试神器-流量回放平台

    # java化测试神器-流量回放平台 作者:佳晖,荣荣 文章结构 基本介绍 使用流程 实现方案 总结 基本介绍 背景 目前公司正在进行php java化迁移工作. Java化测试本质上是一次回归工作. ...

  8. 改IP免费推广平台哪个效果好?

    在网络全面发展的时代,脱离网络发展效果会大打折扣,那么如何有效的利用网络呢?今天黑洞代理给大家介绍一下免费推广,虽然付费广告效果比较好,但如果花时间去做免费推广,将自然排名做好,效果也是非常的好.免费 ...

  9. Web3流量聚合平台Starfish OS,给玩家元宇宙新范式体验

    玩家们享受这里的自由:没有脚本,没有人物定位,各路玩家自己发挥. 元宇宙有多火,已经无需赘言.似乎不投元宇宙的VC,已经是古典VC,没听过元宇宙,和没听过区块链一样out了.不过,一千个人心中有一千个 ...

最新文章

  1. Yii学习笔记【2】
  2. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符
  3. 虚拟化--046 利用web client查看存储
  4. js源码 模仿 jquery的ajax的获取数据(get,post )的请求封装
  5. 如何做相册_腾讯相册管家再创相册管理软件新纪元
  6. 第4章 Python 数字图像处理(DIP) - 频率域滤波5 - 二变量函数的傅里叶变换、图像中的混叠、二维离散傅里叶变换及其反变换
  7. 组态王bitset用法_关于STEP7在组态王里定义I/O离散变量
  8. hibernate 继承映射(二)
  9. 多线程,异步委托,同步委托几种方式的区别
  10. Linux命令之进程的管理
  11. 【ACL2019】知识图谱的全方位总结
  12. mysql编码gbk_更改mysql数据库编码为GBK
  13. Java 关于CoolProp的调用
  14. 联想笔记本linux驱动,联想为Linux驱动的计算机提供自动固件更新
  15. 常用技术面试题(软件测试)
  16. 区块链技术应用于版权领域从何说起?
  17. “泰迪杯”挑战赛 - 基于非侵入式负荷检测与分解的电力数据挖掘(附详细数据及代码)
  18. 【蓝桥杯每日一练:蹩脚两轮车】
  19. 如何使用Graylog来收集日志?
  20. UCF Local Programming Contest 2012(Practice)E. Pete's Pantry 【模拟】

热门文章

  1. Redis常见面试问题汇总及解析
  2. kafka+zookeeper搭建步骤kafka问题
  3. 解决:UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position错误
  4. LeetCode简单题之检查是否所有字符出现次数相同
  5. 超车新势力齐聚港股,谁主沉浮?
  6. 3层-CNN卷积神经网络预测MNIST数字
  7. Android Handler sendEmptyMessageDelayed 和 sendEmptyMessage 的使用
  8. Java 二进制,八进制,十进制,十六进制
  9. 025_Excel知识汇总
  10. FastThreadLocal吞吐量居然是ThreadLocal的3倍