问题背景
产品侧为了在功能需求发布后,更准确的摸准用户倾向。需要支持A/B测试,建立实验组数据,做后期产品分析。
实际目的
C端应用缓存层面区分A/B 访问,减少回源,提高用户响应速度,减轻源站压力。
技术调研
分布式节点网络分发多面
AWS CloudFront 通过加速分发及区域边缘缓存,提供更快的内容传输,提升用户体验。
源站页面内容动态缓存,以路径为为核心第一纬度,C端类型为第二纬度。形成多页面多端缓存。
A/B Testing 目标之一不影响用户体验,那么就要求在同一页面纬度下开展量化分析,在内容缓存的第二位纬度增加“实验类型”,每个页面多面缓存。
示例:
自定义的实验类型标头 “CloudFront-Ab-Experiment”
应用边缘计算
A/B Testing 首要问题是如何分配流量?在哪一层计算分配流量?
(1)设定流量分配比例,A/B Testing实验组以每个页面为第一纬度,端的类型、用户类别标记、功能块等为第二纬度。(修改分配比例后,采样数据必须基于修改生效后的数据)
(2)如果分配流量计算放到源站,数据统计纬度是CDN回源流量而非真正的C端访问流量。
如果指定该页面流量全部回源,但用户体验强依赖区域边缘缓存,方案欠佳。
因此引必须入新技术Labmda Edge在 CDN 节点中计算分配流量,即兼顾用户体验亦可达到计算目的。
docs.aws.amazon.com/zh\_cn/Amaz…
用户PV纬度A/B面
查看器请求
Page View 每一次页面请求按分配比例决定访问A或B的概率大小。
用户UV纬度A/B面
查看器请求 + 查看器响应
User View 是当新用户访问页面时,按照分配比例决定标记为A类用户或者B类用户的概率。A类、B类用户访问内容不同。(用户标记支持指定过期时间)
UV多页A/B面
查看器 + 查看器响应 + 路径标识
根据分配比例决定标记为A类用户或者B类用户的概率,标记是以页面路径为纬度存储,不同页面互不影响。(用户标记支持指定过期时间)
步骤实施
功能验证
Lambda@edge应用流程
CodeBase:console.aws.amazon.com/codesuite/c…
创建应用程序
代码提交后,自动创建或更新函数
添加触发器
发布后绑定触发器自动创建版本
技术落地
详情页产品A/B测发布
确定第一纬度、第二纬度、设定流量比例。
第一纬度内容详情页 : /detail/*
第二纬度A\B类用户:A类 旧版本页面、B类新版本页面
设定流量比例:旧版本页面75% 、新页面分配 25%
创建行为
设定流量比例,发布应用程序
添加触发器并部署
Lambda edge计算 和 应用程序A/B内容组装逻解耦。(部署无依赖关系)
测试验证
- 功能验证(访问数据分析)
A/B内容验证。
删除标记,重新获得访问A/B内容概率分配的权利。
- 缓存验证(压力测试)
压力测试方案,此次需求是通过Lambda@edge增强页面内容缓存能力,因此需要考察缓存命中率及边缘计算性能。
-
应用压测,用户端指标 + 硬件资源监控
-
CDN压测,用户端指标 + 硬件资源监控
Lambda高可用指标体系
-
缓存命中率
-
响应时长高动态范围指标 p90、p99、p99.99 ( 响应时长按最小分布 )
-
每秒请求数高动态范围指标 p90、p99、p99.99 ( 每秒请求数按最大分布 )
-
每秒下载量高动态范围指标 p90、p99、p99.99 ( 每秒下载量按最大分布 )
Lambda 性能分析报告:
-
RequestId: b37880ae-8356-452e-968c-a6a59c911e67
-
Duration: 19.49 ms
-
Billed Duration: 20 ms
-
Memory Size: 128 MB
-
Max Memory Used: 64 MB
-
Init Duration: 144.18 ms
建议后续使用新产品CloudFront Function优化:
-
最大excution time 小于1ms, 同样一段代码执行占用最大允许运行时间的 45%
-
离用户更近,代码可部署在边缘位置,目前lambda是部署在二级POP点
-
无需冷启动
数据验证
- 埋点数据分析(A/B内容是曝光上报还是请求上报)
-
取数逻辑验证
-
埋点上报数据和设定流量分配比例核对
2. 缓存命中数据分析
-
运维提供数据
使用建议
-
页面级用户标记建议设置1天有效时间,超过有效期,重新进行分配。(根据产品诉求来,可调整)
-
不建议频繁变更同一个页面的A/B方案,因为需要清除前一组的标记。(可通过增量方案调整比例)
-
A/B方案需要确定周期,清除当前页面用户标记,开展下一组实验。
-
不建议采用Ten函数,单页面建立十组类型,会削弱缓存效果。
-
A/B实验组同一个页面不同模块的动态分发,可基于所想要数据逻辑来倒推。例如C端动态加载采集曝光数据更加精准,