概览

A/B 测试或金丝雀部署技术允许开发人员尝试网页的两种或更多版本。随机向用户显示各种版本,然后使用统计分析来确定哪种版本在实现给定业务目标方面表现更好。例如,可以测试产品页面的 UI 版本,目标是提高产品销量。

架构决策

您可以根据自己的技术和业务需求以不同的方式实施 A/B 测试。其中一项主要技术决策是执行版本选择逻辑的位置:在客户端、在边缘服务器端(CDN 级别)还是在原始服务器端。

原始服务器端版本选择。在这种方法中,A/B 选择直接在托管您的 Web 应用程序的原始服务器上执行。尽管这种方法与 CDN 无关,但它与 CDN 缓存或静态文件托管不兼容。它是完全动态的服务器端呈现 Web 应用程序的一个选项。

边缘服务器端版本选择。在这种方法中,您在 CDN 级别做出版本选择决策。这种方法几乎不需要对应用程序进行任何更改,并且与 CDN 缓存兼容。在 CloudFront 中,您可以使用 Edge 函数实现 A/B 测试逻辑。除了外部 A/B 测试 API 外,Edge 函数还可以使用请求属性(国家/地区、cookie 等)来选择其中一个版本并让 CloudFront 通过缓存提供该版本。

客户端版本选择。在这种方法中,你的前端首先向 A/B 测试 API 发出请求以决定要提供哪个版本,然后根据响应下载该版本,将其在浏览器中呈现。在这种方法中,您的 A/B 测试与 CDN 无关,但是它与您的应用程序紧密耦合,并且由于客户端的额外步骤而带来了额外的延迟。另请注意,这并不总是一个选项,例如对静态生成站点(SSG)进行 A/B 测试。要实施客户端 A/B 测试,可以使用 CloudWatch Evidently。它提供客户端 SDK 和 UI 以控制 A/B 测试试验。如需了解 CloudWatch Evidently 的实践教程,请考虑参加此研讨会。

让我们重点介绍一下边缘服务器端 A/B 测试。要为您的业务设计最佳实施方案,请考虑其他问题:

  • 您是否需要粘性(例如,同一个用户总是会得到相同的版本)? 粘性通常使用 cookie 来实现。
  • 使用哪些维度为用户选择版本?国家/地区、用户 ID 等。
  • 您进行 A/B 测试的频率如何? 与更简单的、偶尔的 A/B 测试相比,频繁使用 A/B 测试及由不同的团队并行运行许多试验,需要更复杂的实现。

要了解使用 CloudFront 的 Edge 函数进行 A/B 测试的一些边缘服务端实现,请考虑参加此实践研讨会。在下一节中,我们将分享上述研讨会中使用 CloudFront 进行 A/B 测试的两种常见实现。

使用边缘服务器端 A/B 测试的常见使用案例

偶尔进行的 A/B 测试

对于偶尔的 A/B 测试需求,例如机构网站的季度设计改进,请在试验期间考虑基于 CloudFront Functions 的解决方案。该解决方案基于对缓存行为配置的两个函数,这两个函数与您要运行 A/B 测试的页面相匹配:

  • 一个是查看者请求函数,用于检查传入请求的实验 Cookie 值,并据此重写所选页面变体的 URL。如果 Cookie 不存在,该函数将使用您的自定义逻辑选择变体,例如变体 A 为 60%,变体 B 为 40%,仅适用于来自法国的请求。
  • 一种是查看者响应函数,如果 Cookie 尚不存在,则根据选定的变体在客户端上设置 Cookie。试验 Cookie 用于确保单个用户始终收到相同的页面变体,以避免破坏他们的 Web 体验。

更改变体选择逻辑(例如增加变体 B 的百分比)需要更新查看者事件的函数代码,这通常需要几秒钟才能完成。完成 A/B 测试实验后,您可以移除边缘函数以节省成本。

频繁的 A/B 测试

如果您在网站上持续进行 A/B 测试,并且每天进行试验,则仍然可以使用之前基于 CloudFront Function 的解决方案。但是,建议将变体选择参数(例如变体权重)与函数代码分离。您可以使用 CloudFront KeyValueStore 在函数代码之外存储此类参数。KeyValueStore 非常适合作为全局(每个 PoP)、低延迟读取、
大规模键值数据存储(每秒数百万个请求)。

请注意,您的用例应遵从 KeyValueStore 配额,例如最大大小(5MB)或更改每秒几次 API 调用的速度限制。

CapitalOne 案例研究:使用 CloudFront Functions 和 KeyValueStore 进行 A/B 测试

高级 A/B 测试

如果基于 CloudFront Function 的解决方案不能满足您的 A/B 测试需求(例如,如果 KeyValueStore 配额限制您的使用案例),请考虑使用基于 Lambda@Edge 的解决方案。如果您正在运营一个大型电子商务网站,并且许多团队在网站的不同部分同时高速执行试验,则可能会出现这种情况。  在这种情况下,请使用 Lambda@Edge 而不是 CloudFront Function,并使用外部数据来源(例如 DynamoDB 全局表)来存储 A/B 测试参数。LaunchDarkly 等功能管理工具提供与 DynamoDB 的集成,以保留 A/B 测试参数。

资源

此页内容对您是否有帮助?