Cloudflare Workers Cache: Serverless Origin 的边缘缓存

Cloudflare Workers Cache: Serverless Origin 的边缘缓存

Cloudflare 推出了 Workers Cache,这是一个直接位于 Worker 前端的层级缓存系统。这种架构允许 Cloudflare 在不调用 Worker 的情况下提供缓存响应,从而消除了缓存命中时的 CPU 计费,并降低了终端用户的延迟。

架构转变:Worker 作为 Origin

从历史上看,Cloudflare Workers 位于缓存和 origin 之前。这对于在请求到达缓存的 origin 之前进行请求转换、URL 重写或 A/B 测试非常理想。然而,随着 Astro、Next.js、Remix 和 SvelteKit 等现代框架越来越多地使用 Workers 作为主要服务器(即 origin),之前的模型意味着每个请求都会触发 Worker 调用,即使是对于相同的响应。

Workers Cache 翻转了这一模型。通过将缓存置于 Worker 之前,Cloudflare 现在可以直接从边缘提供响应。如果存在新鲜的缓存响应,Worker 就不会运行,也不会产生 CPU 计费。如果发生未命中(miss),Worker 将执行一次,填充缓存,随后的请求将从全球缓存中提供服务。

关键技术特性

标准化 HTTP 控制

Workers Cache 通过 wrangler.jsonc 中的单行配置进行配置,并使用标准 HTTP 标头进行管理:

  • Cache-Control:定义 TTL(生存时间)和缓存行为。
  • stale-while-revalidate:允许 Cloudflare 在后台刷新内容的同时立即提供过期的响应,确保用户永远不会等待重新渲染。
  • Vary:启用内容协商。Cloudflare 根据指定的请求标头(例如 Accept-LanguageAccept-Encoding)存储单独的缓存变体,确保为每个客户端提供正确的表示。
  • Cache-Tag:允许通过 ctx.cache.purge() 对特定内容组进行程序化、细粒度的失效处理。

区域层级缓存

每个启用了缓存的 Worker 默认使用两层拓扑结构:

  1. 较低层级 (Lower Tier):位于距离用户最近的数据中心。
  2. 较高层级 (Upper Tier):一个区域聚合器,用于填充较低层级。

这种结构确保了世界任何地方的第一个请求都会填充较高层级,与扁平缓存相比,这显著增加了整个网络的缓存命中率。

使用 ctx.props 实现多租户安全性

为了支持身份验证或用户特定数据,Workers Cache 与 ctx.props 集成。当通过 service binding 调用 Worker 时,传递在 ctx.props 中的任何标识符(例如 userIdtenantId)都会成为缓存键的一部分。这可以防止用户之间的数据泄露,同时仍允许将身份验证后的响应缓存在边缘。

高级组合模式

由于 Workers Cache 位于每个 Worker 入口点(包括命名的 WorkerEntrypointctx.exports 调用)之前,开发人员可以构建作为记忆化阶段链的应用:

  • 网关阶段 (Gateway Stage):一个外部入口点(禁用缓存)用于处理身份验证和请求规范化。
  • 后端阶段 (Backend Stage):一个内部入口点(启用缓存)用于执行昂贵的数据获取和渲染。

这允许“网关”在每个请求上运行以确保安全性,而“后端”仅在缓存未命中时运行。这种模式可以扩展到包装 Durable Objects 或通过在请求到达缓存的入口点之前剥离跟踪参数来规范化 URL。

计费与可观测性

计费模型

缓存命中减少了成本,因为它消除了 CPU 时间费用,尽管它们仍会产生标准的 Workers 请求速率费用。

| 结果 | 请求费用 | CPU 时间费用 | | :--- | :--- | \n| 缓存 HIT | 标准速率 | 不计费 | | 缓存 MISS | 标准速率 | 计费 | | 缓存 BYPASS | 标准速率 | 计费 |

注意: 之前免费的请求——例如静态资源请求和 worker-to-worker 调用——在启用缓存时现在按标准请求速率计费,因为它们必须咨询缓存。

可观测性

缓存性能已集成到 Workers 可观测性仪表板中,提供每次调用的命中、未命中、更新 (SWR) 和绕过数据,帮助开发人员调整其 max-agestale-while-revalidate 设置。

社区观点

虽然技术实现因其遵循 HTTP 标准而受到称赞,但一些社区成员对计费变更表示了担忧:

"你现在要为静态资源请求付费了!这对我来说毫无意义……这听起来像是一个旨在产生更多利润的 bug。"

其他人则强调了该功能对服务端渲染 (SSR) 性能的重要性:

"一个很大的担忧一直是‘为什么 workers 位于我的缓存之前?如果我返回一个缓存的结果,那将是调用次数的浪费。'"

框架集成

Workers Cache 已经通过 cacheCloudflare 提供程序集成到了 Astro Cloudflare 适配器中,允许开发人员直接在 Astro 配置中为 routeRules 定义 maxAgeswr

Sources