Yi's Blog

CDN预热是怎么回事儿

2020-09-28

做运维工作总免不了跟 CDN 打交道。在我的工作中最常用到的,一个是阿里云 CDN,一个是 AWS CloudFront。由于众所周知的原因,通常我们在国内使用阿里云 CDN,在国外使用 AWS CloudFront。这里我就不比较孰优孰劣了,CDN 技术是一个很大的话题,今天只想简单聊聊 CDN 预热是怎么回事儿。

CDN 如何向用户提供内容

这里引用一段 CloudFront 的文档来说明:

  1. 用户访问您的网站或应用程序,并请求一个或多个文件,例如图像文件和 HTML 文件。
  2. DNS 将请求传送到以最佳方式满足该请求的 CloudFront POP(边缘站点),通常是以延迟衡量的最近 CloudFront 边缘站点,然后将请求传送到该边缘站点。
  3. 在 POP 中,CloudFront 检查其缓存中是否存在所请求的文件。如果这些文件在缓存中,CloudFront 将它们发回给用户。如果这些文件没有 位于缓存中,它会执行以下操作:
    a. CloudFront 将该请求和分配中的规范进行比较,然后根据相应文件类型将对文件的请求转发到您的源服务器,例如,将对图像文件的请求转发到 Amazon S3 存储桶,而将对 HTML 文件的请求转发到 HTTP 服务器。
    b. 源服务器将这些文件发回边缘站点。
    c. 在源中的第一个字节到达后,CloudFront 立即开始将文件转发到用户。CloudFront 还会将文件添加到边缘站点的缓存中,以便下次有人请求这些文件时使用。

CloudFront 如何向用户提供内容

什么是 CDN 预热

从上面的介绍中可以知道,CDN 通过边缘节点中的缓存来加速用户的访问。当某个资源第一次被访问时,由于边缘节点中没有缓存,那就要向源站请求数据。这样会导致某一部分用户访问站点时加载较慢。为了解决这一问题,就要在用户访问之前,提前把站点的资源文件加入边缘节点的缓存,CDN 预热的概念也就由此而来了。

CloudFront 没有提供预热的功能。阿里云的文档中是这么介绍:

CDN提供资源的刷新和预热功能。通过刷新功能,您可以强制CDN节点回源并获取最新文件;通过预热功能您可以在业务高峰前预热热门资源,提高资源访问效率。

缓存命中率

缓存命中率是衡量 CDN 加速效果的一项重要指标,它既与 CDN 的服务质量有关,也与使用者的配置及业务场景有关。
对于一个静态站点来说,在CDN 经过预热后,理想的缓存命中率应该在 99% 以上。

我遇到的问题

在近期的一次业务活动中,为了应对业务流量高峰,我们对业务使用的阿里云 CDN 提前进行了预热操作,操作记录表明预热进度 100%,预热状态完成。但在业务活动开始的前十分钟,我们发现页面资源请求很慢,CDN 的命中率最低时只有 39%。
阿里云预热记录

通过查阅文档并和阿里云技术支持支持沟通后,得到以下结论:

  1. 阿里云 CDN 边缘节点分为 L1,L2 两级,架构可以抽象为 UserClient –> L1 –> L2 –> Origin 。阿里云提供的预热功能只是将资源缓存在 L2 节点上。用户初次访问某资源时,L1 节点仍需从 L2 取回资源。
  2. 阿里云控制台上显示的预热状态完成,进度100%,仅代表预热任务下发完成,并不代表预热成功,不能说明资源缓存在了边缘节点上。资源能否成功缓存在边缘节点上,受多种因素的影响(链路质量,源站带宽),尤其当源站在海外时,预热效果更差,很可能超过半数以上的 L2 边缘节点都没有成功缓存(但在控制台上看不出来),我上面遇到的问题就是这种情况(通过阿里云技术支持查询后台日志给出的结论)。
  3. 即使 CDN 缓存时间未过期,也可能产生缓存失效的情况。这一点由 CDN 的原理决定,各厂商 CDN 都有这种问题。CDN 的边缘节点是所有用户共享的,边缘节点的缓存容量是有上限的,当边缘节点的容量达到某一阈值时,就会按内部算法剔除较为冷门的资源,即使这些资源还没到过期时间。

结论

  1. AWS CloudFront 本身没有提供预热功能。阿里云 CDN 提供了预热功能,但不可靠。
  2. 业务不能过分依赖于 CDN 的预热,尤其是新业务上线并有突增流量和源站链路不稳定两种情况。
  3. 要理解 CDN 的原理,比如阿里云有两级缓存,比如缓存可能提前失效。
Tags: CDN