Mekal Z

Mekal Z

A programmer running out of the wall.
twitter

高性能系统设计中的CDN

a23a276571855583b91c098861817fff.avif
想象一下,一家公司在加利福尼亚的 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 在以下设计中将适合哪里?您可以在评论中留下您的答案。

image_1676286418836_0.png

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。