深入了解Amazon CloudFront的缓存逻辑与架构

前言

网络连接与基础设施

CloudFront的边缘站点通过AWS的主干网络与各个区域相连接。该骨干网络是一个完全冗余的全球性基础设施,由多个100GbE的平行光纤组成,并与数以万计的网络连接相结合,以提升源内容获取的效率和动态内容的加速能力。

为了以更低的延迟将内容分发给最终用户,Amazon CloudFront利用一个覆盖48个国家和地区、包含450多个接入点以及13个区域边缘缓存的全球网络。

CloudFront的三层缓存架构

  • 边缘站点(Pod):这是内容缓存的主要位置,分布在多个网络服务提供商的数据中心。

  • 区域边缘缓存(Regional Edge Caches, REC):这些是部署在全球各地的CloudFront位置,靠近用户查看者。它们位于源服务器与POP(即全球边缘站点)之间,全球边缘站点直接为查看者提供内容。

  • 源护盾(Origin Shield):在CloudFront缓存基础设施中增加的一个层级,有助于减轻源的负载,提升其可用性,并降低运营成本。

图片

源护盾的优势

  • 提升缓存命中率:增加源之前的额外缓存层。当启用源护盾时,所有从CloudFront缓存层到源的请求都会经过该护盾,从而增加缓存命中的概率。CloudFront可以通过从源护盾到源的单个请求来检索每个对象,使得缓存的其他层(边缘站点和区域边缘缓存)可以从源护盾中获取对象。

  • 降低源负荷:减少同时发送到源的请求数量。对于不在源护盾缓存中的内容请求,将与同一对象的其他请求合并,从而确保发送到源的请求数量仅为一个。这在高峰负载或突发流量期间有助于保持源的可用性,并降低即时包装、图像转换及数据传输等成本。

  • 优化网络性能:对于位于AWS区域的源,CloudFront的网络流量始终在高吞吐量的CloudFront网络上保持直至到达源。对于位于AWS外的源,CloudFront的流量则会持续在其网络中,直到到达源护盾(与源之间的连接具有低延迟)。

源护盾的使用案例

  • 针对不同地理区域的查看者
  • 为实时流媒体或动态图像处理提供即时包装的源
  • 具有容量或带宽限制的内部源
  • 与多个内容分发网络(CDN)并行工作的负载

#01

CloudFront的缓存回源逻辑

静态内容(可缓存对象)

请求方式:GET | HEAD | OPTIONS

路径:当客户请求访问CloudFront时,如果边缘节点没有缓存,将请求转发到区域边缘节点(REC)缓存,如果该缓存也没有,则请求将回到源站。

优化:启用源护盾后,访问路径由区域缓存到达源护盾,经过AWS骨干网,如果源护盾也没有缓存内容,则请求将直接回源。

图片

动态内容(不可缓存对象)

请求方式:POST | PUT | PATCH | DELETE

路径:当客户请求访问CloudFront时,边缘节点直接通过互联网连接到源站。

优化:启用源护盾后,请求通过AWS骨干网进行优化。

回源路径:用户请求 → 边缘站点 → 区域边缘缓存 → 源护盾 → 源

图片

启用源护盾

源护盾降低源站负载,提升第三方源站的回源速度

例如,欧洲用户请求位于澳大利亚的第三方源站。请求将从边缘节点经过区域边缘缓存(REC),然后通过AWS骨干网到达源护盾,最后通过互联网连接到源站。启用源护盾后,可以缩短互联网路径,提高回源速度。

图片

#02

示例

为现有源启用源护盾

1)导航到CloudFront控制台,选择要修改的分配。

2)选择“源”选项卡,找到要更新的源,并点击“编辑”。

图片

3)启用源护盾,选择“是”,并选择相应的源护盾区域。

注意:源护盾是区域性的,通常选择靠近源站的区域。

图片

4)在页面底部选择“是”,并进行编辑。

为新源启用源护盾

1)导航到CloudFront控制台,选择要新增源的分配。

2)选择“源”选项卡,点击“创建源”。

图片

3)在创建源页面的设置中,启用源护盾,选择“是”,并选择相应的源护盾区域。

4)在页面底部选择“是”,并进行编辑。

图片

#03

源护盾的成本估算

根据进入源护盾的请求数量,您将产生增量费用。

对于代理到源的动态(不可缓存)请求,源护盾始终是一个增量层。动态请求使用以下HTTP方法:PUT、POST、PATCH和DELETE。

要估算动态请求的源护盾费用,可使用以下公式:

动态请求总数 x 每10,000个请求的源护盾费用 / 10,000

对于可缓存的请求(HTTP方法GET、HEAD和OPTIONS),源护盾有时是一个增量层。当启用源护盾时,您可以为源护盾选择AWS区域。

对于自然去往与源护盾相同区域的区域边缘缓存的请求,源护盾不是增量层,因此不会产生费用。

但是,从源护盾到不同区域的区域边缘缓存的请求,源护盾则是增量层,您将为这些请求产生费用。

要估算可缓存请求的源护盾费用,请使用以下公式:

可缓存请求总数 x(1 – 缓存命中率)x 从不同区域的区域边缘缓存进入源护盾的请求百分比 x 源护盾每10,000个请求收费 / 10,000