CloudFront 600+ PoP 是如何运作的 - Anycast 路由与缓存层级机制

详细介绍 CloudFront 将用户请求路由到最近 PoP 的 Anycast 机制、边缘节点与区域边缘缓存的两层结构以及影响缓存命中率的设计因素。

什么是 PoP(Point of Presence)

CloudFront 的 PoP 是分布在全球各地的缓存服务器集群。截至 2024 年,600 多个 PoP 部署在 90 多个城市。PoP 的作用是缓存源站服务器(S3 存储桶或 EC2 实例等)的内容,从物理上靠近用户的位置进行分发,从而降低延迟。如果东京的用户直接访问美国弗吉尼亚的 S3 存储桶,跨越太平洋的往返会产生 150-200ms 的延迟。如果内容缓存在东京的 PoP 中,延迟可缩短至 5-10ms。PoP 的规模并不统一。东京、伦敦、弗吉尼亚等大型 PoP 由数千台服务器组成,可以缓存大量内容。而小型城市的 PoP 仅有数十到数百台,缓存容量有限。CloudFront 根据流量动态调整 PoP 容量,在大型活动(体育直播、产品发布等)期间临时增加容量。

Anycast 路由 - 将用户引导至最近 PoP 的机制

CloudFront 将用户请求路由到最近 PoP 的机制是 DNS 路由与 Anycast 的组合。当用户访问 CloudFront 分配的 URL(例如:d1234.cloudfront.net)时,首先进行 DNS 解析。CloudFront 的 DNS 服务器根据用户 DNS 解析器的 IP 地址推测地理位置,返回最近 PoP 的 IP 地址。这里 Anycast 登场。Anycast 是多个 PoP 同时宣告相同 IP 地址的技术。通过 BGP(Border Gateway Protocol)路由,数据包会自动到达网络上最近的 PoP。仅靠 DNS 路由,当 DNS 解析器位置与用户实际位置不同时(如使用企业集中式 DNS 服务器),可能无法选择最优 PoP。Anycast 在网络层选择最短路径,弥补了这一问题。2022 年以后,CloudFront 还支持 EDNS Client Subnet(ECS),DNS 解析器可以将用户实际的子网信息传递给 CloudFront 的 DNS,从而实现更精确的 PoP 选择。

两层缓存 - 边缘节点与区域边缘缓存

CloudFront 的缓存采用两层结构。第一层是边缘节点(PoP),位于最靠近用户的位置。第二层是区域边缘缓存(REC),位于边缘节点和源站服务器之间。REC 全球有 13 个,拥有比边缘节点更大的缓存容量。请求流程如下:用户请求到达边缘节点,如果缓存中有内容则立即返回(缓存命中)。如果边缘节点没有缓存,则查询 REC。如果 REC 有缓存则从那里返回,否则去源站服务器获取。这种两层结构的优势在于可以大幅减少对源站服务器的请求数。不太热门的内容(长尾)在单个边缘节点容易被从缓存中淘汰,但由于 REC 的大缓存容量,保留的概率更高。根据 AWS 公布的数据,引入 REC 后,对源站的请求数最多减少了 60%。

影响缓存命中率的设计因素

CloudFront 的缓存命中率根据设计可以从 50% 到 99% 不等。决定缓存命中率的最大因素是缓存键的设计。CloudFront 默认使用 URL 完整路径作为缓存键,但如果将查询字符串、头部、Cookie 包含在缓存键中,即使是相同内容,由于缓存键不同,缓存会分散导致命中率下降。例如,如果查询字符串包含跟踪参数(utm_source、utm_medium 等),同一页面会因参数组合不同而创建不同的缓存条目。通过 CloudFormation 的缓存策略,以白名单方式指定包含在缓存键中的查询字符串并排除跟踪参数,命中率可以显著提升。TTL(Time to Live)设置也很重要。TTL 过短会导致缓存频繁失效,增加对源站的请求。对静态资源(图片、CSS、JS)将 TTL 设为 1 年,并在文件名中包含哈希(app.a1b2c3.js),在内容更新时通过新 URL 自动切换缓存的策略最为有效。

Origin Shield - 第三层缓存保护源站

2020 年引入的 Origin Shield 是在 REC 和源站之间添加额外缓存层的功能。启用 Origin Shield 后,所有 REC 的源站获取请求会汇聚到一个 Origin Shield 节点。如果 Origin Shield 有缓存,就不会向源站发送请求。Origin Shield 最大的效果是缓解缓存的「惊群问题」。这是指热门内容的 TTL 过期瞬间,全球 PoP 同时向源站发送请求的现象。没有 Origin Shield 时,13 个 REC 会同时向源站发起请求,有了 Origin Shield 则汇聚为 1 个请求。Origin Shield 按请求数计费(每万次请求 0.0090 USD),考虑到源站服务器负载减轻和扩展成本降低,在大多数情况下是性价比很高的投资。特别是当源站是 Lambda Function URL 或 API Gateway 等按量计费服务时,Origin Shield 减少的请求直接转化为成本节省。如果想系统学习 CDN 的设计与优化,可以参考专业书籍(Amazon)