想象一下,一家公司在加利福尼亚的 AWS 数据中心托管一个网站,对于美国的用户来说,加载可能需要 100 毫秒,但对于中国的用户来说,加载可能需要 3 到 4 秒。幸运的是,有一些策略可以最小化远离用户的请求延迟。在设计或构建全球规模的系统时,您始终需要牢记这些策略。
什么是 CDN?#
CDN 或内容分发网络是现代和流行的解决方案,用于最小化从服务器获取静态资产时的请求延迟。理想的 CDN 由一组分布在全球的服务器组成。因此,无论用户离您的服务器有多远,他们总是离您的 CDN 很近。因此,用户不必从源服务器获取静态资产,如图像、视频、HTML、CSS 和 JavaScript。用户可以快速从 CDN 获取这些文件的缓存副本。请记住,静态资产的大小可能相当大,想想高清壁纸图像。通过从附近的 CDN 服务器获取该文件,我们还节省了大量的网络带宽。
流行的 CDN#
云服务提供商通常提供自己的 CDN 解决方案,因为它非常流行且易于与他们的其他服务集成。一些流行的 CDN 包括 Cloudflare CDN、AWS Cloudfront、GCP Cloud CDN、Azure CDN 和 Oracle CDN。
CDN 是如何工作的?#
CDN 是一个全球分布的服务器组,为您的源服务器缓存静态资产。每个 CDN 服务器都有自己的本地缓存,所有缓存应该保持同步。
CDN 缓存的填充有两种主要方式,这在推送和拉取 CDN 之间形成了区别。
在推送 CDN 中,工程师必须将新文件或更新的文件推送到 CDN,将它们传播到所有 CDN 服务器缓存中。
在拉取 CDN 中,服务器缓存是懒惰更新的。也就是说,当用户向 CDN 服务器发送静态资产请求时,如果它没有该资产,它将从源服务器获取该资产,填充其缓存,然后将其发送给用户。如果 CDN 在其缓存中有该资产,它将返回缓存的资产。
这两种方法各有优缺点。在推送 CDN 中,开发人员需要更多的工程工作来确保资产始终是最新的。另一方面,拉取 CDN 需要更少的维护,因为 CDN 会自动从源服务器获取不在其缓存中的资产。拉取 CDN 的缺点是它们不知道您是否决定更新,然后获取此更新的资产。因此,在资产在源服务器上更新后,拉取 CDN 的缓存在一段时间内将保持不变。另一个缺点是,第一次请求拉取 CDN 时总是需要一些时间,因为它必须访问源服务器。
尽管有这些缺点,拉取 CDN 仍然比推送 CDN 更受欢迎,因为它们更容易维护。
还有几种方法可以减少静态资产的存活时间。例如,拉取 CDN 通常在缓存时为资产附加时间戳。默认情况下,它们通常只缓存资产最多 24 小时。如果用户请求 CDN 缓存中的过期缓存,CDN 将从源服务器重新获取资产,并在有更新时获取更新的资产。另一个解决方案是缓存破坏,您可以使用与先前资产版本不同的唯一哈希或 E-tag 来缓存资产。
何时不应使用 CDN?#
CDN 通常是减少静态文件请求延迟的好服务,但对于大多数 API 请求则不然。然而,有一些情况您不想使用 CDN。
如果您的服务目标用户位于特定区域,那么使用 CDN 将没有任何好处,因为您可以直接在该区域托管源服务器。
如果提供的资产是动态和敏感的,CDN 也不是一个好主意。例如,您不想在处理金融或政府服务等敏感情况时提供静态数据。
关于 CDN 的一个示例面试问题#
想象一下,您正在构建亚马逊的产品列表服务,该服务向在线购物者的浏览器提供一系列元数据和图像,CDN 在以下设计中将适合哪里?您可以在评论中留下您的答案。