Google 如何利用“在重新验证时过时”功能提升广告效果

Jonathon Imperiosi
Jonathon Imperiosi

此案例研究重点介绍了如何通过提升第三方资源的性能来提高业务指标。虽然之前的一项研究衡量了添加广告延迟的成本,但这项研究表明了实际性能改进的价值:

0.5%

发布商的收入提升

2%

增加早期广告脚本加载次数

资料来源:Google 内部数据,2019 年 6 月至 7 月。

背景

Google 发布商代码 (GPT) 是 Google Ad Manager 的广告代码植入脚本,用于在网页上请求和呈现展示广告。通过为 GPT 实现 stale-while-revalidate HTTP 标头,GPT 团队能够提高 Google 展示广告的速度和效果,从而让发布商合作伙伴受益。这种技术同样适用于任何其他场景,在这些场景中,尽快加载脚本比加载最新代码更重要。

问题

GPT 以引导脚本 gpt.js 的形式部署,该脚本的存留时间 (TTL) 较短,为 15 分钟。这种较短的 TTL 可让脚本快速更新或回滚。加载后,gpt.js 会请求并加载具有较长 TTL 的其他实现脚本。

15 分钟的 TTL 过期后,缓存中的 gpt.js 版本会过时,需要重新验证。以前,此重新验证过程涉及发出同步网络请求以获取脚本的最新副本,从而导致第一个广告请求的延迟时间增加。

解决方案

stale-while-revalidate 属性由 Cache-Control 标头使用,用于定义一个额外的时间窗口,在此期间,缓存可以使用过时的资源,同时异步重新验证该资源。这有助于开发者在即时性(立即加载缓存内容)和新鲜度(确保将来使用缓存内容的更新)之间取得平衡。

Google 展示广告案例研究

GPT 团队于 2016 年在 gpt.js HTTP 响应中添加了此 Cache-Control 标头,以期浏览器实现 stale-while-revalidate

cache-control: private, max-age=900, stale-while-revalidate=3600

此设置意味着,如果在上次缓存值后的 15 到 60 分钟内请求 gpt.js,即使缓存值已过时,系统也会使用该缓存值来满足请求。与此同时,系统会在后台发出重新验证请求,以使用新值填充缓存,供日后使用。

Chrome 在版本 75 中面向 99% 的流量推出了 stale-while-revalidate,暂时停用了 1% 的流量的该功能,以衡量其影响。GPT 团队记录了这 1%(实验组)的指标,以及启用该功能的 1% 流量样本(对照组),以测试 stale-while-revalidate 对广告脚本的有效性。在 2 周内记录的指标中,从 52 亿次 Google 展示广告展示的样本规模来看,对照组的观测结果如下:

  • 广告展示次数增加了 0.3%。
  • 收入增长 0.5%。
  • 早期广告脚本加载量(从网页加载开始到加载完成用时 <500 毫秒)增加了 2%。
  • 广告脚本成功加载的总体次数增加了 1.1%。
广告脚本加载次数与从网页加载开始到广告脚本加载的时间(毫秒)之间的百分点变化
资料来源:Google 内部数据,2019 年 6 月至 7 月。

如图表所示,此实验的结果可归因于成功加载的广告脚本数量增加,其中大部分发生在网页加载过程的早期。

在您的网站上实现 stale-while-revalidate

GPT 团队发现,通过 stale-while-revalidate 对 HTTP 标头进行相对较小的更改,可以提高速度并提升业务指标。如需详细了解如何在自己的网站上实现 stale-while-revalidate,请参阅利用 stale-while-revalidate 保持内容新鲜