前端做 AB 实验的三种分流方式
·
Yin灏
背景
为了验证一些想法是否真的有业务价值,往往需要做 AB 实验。
做 AB 实验,绕不过去的问题就是分流
什么是分流?
- 比如 100 个用户访问你的站点的某个 path,假如分流是五五开,那么结果就是 50 个用户看的是 A 页面,另外的 50 看的是 B 页面
常见的三种分流方式
- 接口分流
- 投放侧分流
- nginx 层分流
1. 接口分流
原理:
- 展示 AB 内容前,先调接口,根据响应的结果渲染 A 或 B
好处:
- 可以让运营参与配置,无需 RD 参与,就可以改实验条件
适用场景:
- 同一个集群内的需求
不适用的场景:
- 不同集群的需求,比如: 性能优化、内容/流程重构等对代码进行破坏性修改的,这种要做 AB 实验的话,是需要重新部署到新集群去的。这种接口分流就不再适用,因为 2 个集群,已经是 2 套代码了,只能在接口的更上层做分流
缺点:
- 对于 CSR 项目来说,性能伤害比较大,因为要通过 http 接口,来获得 AB 信息
- 对于 SSR 项目来说,要做成服务发现去调用,而不是前端去调用,否则也会伤害性能
2. 投放侧分流
原理:
- 给运营提供 AB 两个 url,让运营去投放平台投放。这个分流其实跟技术方面就没啥太大关系了,但也是一种思路
好处:
- 可以做接口分流做不了的 AB 实验
- 还能做 nginx 层的更上层的 CDN 缓存的 AB 实验
适用场景:
- 可以做接口分流和 nginx 层分流做不了的场景
不适用的场景:
- 无
缺点:
-
投放平台可能会带来 buff 加成,导致影响实验真实性
buff 加成的意思是:为了让你更愿意在投放平台投放,在初期可能会有冷启动,给你分配更优质的用户,提升你的转化率
3. nginx 层分流
原理:
- 流量打到对应服务器之前,会先经过 nginx 层,可以由 nginx 层把流量分到对应的服务器(集群)上
如何实现?
- 公司应该有这方面的基建,可以 oncall 问。否则只能让运维帮忙配置一下
好处:
- 可以做接口分流做不了的场景
- 可以解决投放侧分流带来的副作用
适用场景:
- 可以做接口分流做不了的场景
不适用的场景:
- nginx 层更上层的实验,比如 CDN 缓存的 AB 实验就做不了
CDN 缓存的 AB 实验是什么意思?
- 就是想验证 CDN 缓存的性能提升到底能为业务带来多少价值。
- CDN 缓存本身还是有不少副作用的,感兴趣的可以翻我之前关于 CDN 缓存的文章juejin.cn/post/716307…
缺点:
- 需要考虑用户刷新的问题(比如:原本展示的是 A,刷新后可能会展示 B,这样会给实验结果造成点误差)
如何解决这个缺点?
- 用组合分流
- cookie 分流 + 50%随机分流 (假设我们要 55 开分流) 举例:
- 假设实验 A 在 A 集群,实验 B 在 B 集群,我们总的需要配 3 条 nginx 配置
- 配置 1:当 cookie:a=1 存在时,100%命中 A 集群
- 配置 2:当 cookie:b=1 存在时,100%命中 B 集群
- 配置 3:50%命中 A 集群,50%命中 B 集群
- 再加上前端的代码改造,A 集群的代码会写入 cookie:a=1,B 集群的代码会写入 cookie:b=1 这样就配完了,解释一下为什么这样配置就可以解决
- 当用户初次访问时,肯定没有 cookie,那么自然 55 开分流到 AB
- 假设当前被分流到了 B,那么此时会种下 cookie:b=1,用户刷新后,会固定打到 B 集群,这样就可以保证实验结果的真实准确了!
总结
总的来说,各有优缺点和适用场景,大家可以根据自己业务需求,考虑对应的方案