AWS Lambda在AB测试中的实践

1,577 阅读5分钟

问题背景

产品侧为了在功能需求发布后,更准确的摸准用户倾向。需要支持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内容组装逻解耦。(部署无依赖关系)

测试验证

  1. 功能验证(访问数据分析)

A/B内容验证。

删除标记,重新获得访问A/B内容概率分配的权利。

  1. 缓存验证(压力测试)

压力测试方案,此次需求是通过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优化:

  1. 最大excution time 小于1ms, 同样一段代码执行占用最大允许运行时间的 45%

  2. 离用户更近,代码可部署在边缘位置,目前lambda是部署在二级POP点

  3. 无需冷启动

数据验证

  1. 埋点数据分析(A/B内容是曝光上报还是请求上报)
  • 取数逻辑验证

  • 埋点上报数据和设定流量分配比例核对

  2.  缓存命中数据分析

  • 运维提供数据

使用建议

  1. 页面级用户标记建议设置1天有效时间,超过有效期,重新进行分配。(根据产品诉求来,可调整)

  2. 不建议频繁变更同一个页面的A/B方案,因为需要清除前一组的标记。(可通过增量方案调整比例)

  3. A/B方案需要确定周期,清除当前页面用户标记,开展下一组实验。

  4. 不建议采用Ten函数,单页面建立十组类型,会削弱缓存效果。

  5. A/B实验组同一个页面不同模块的动态分发,可基于所想要数据逻辑来倒推。例如C端动态加载采集曝光数据更加精准,