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 进行部署,需要 15 分钟的较短存留时间 (TTL)。这个较短的 TTL 可让脚本快速更新或回滚。加载后,gpt.js 会请求并加载其他实现脚本,这些脚本的 TTL 更长。

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

解决方案

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

Google 展示广告案例研究

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

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 保持最新状态一文。

照片由 Kahica 拍摄,选自 Unsplash 网站