目录

第十四章 CDN(Content Delivery Network 内容分发网络)模式

这种模式着重于通过全球分布式边缘缓存来降低常用文件的网络延迟。

其目标是加快应用程序内容的交付速度。内容是指任何可以存储在文件中的信息,例如图像、视频和文档。内容分发网络 (CDN) 是一种充当全球分布式缓存的服务。CDN 在世界各地多个位置保存应用程序文件的副本。当这些位置靠近用户时,内容无需长途传输即可交付,从而加快到达速度,提升用户体验。

CDN 节点战略性地分布在全球各地,尽可能靠近应用程序用户。CDN 拥有自己的 URL,这些 URL 由地理负载均衡器解析,无论用户身处何地,都会将其定向到最近的节点。

文件流如图 14-1 所示。当首次请求 CDN URL 时,CDN 会从主源(通常称为源服务器)检索文件,然后将其返回给请求用户,同时缓存一个本地副本以满足后续对该文件的请求。当请求 CDN URL 且该文件已被缓存时,CDN 会将该文件的本地缓存副本返回给请求用户。这比用户从源服务器(通常距离更远)获取文件要快得多。当多个用户通过 CDN 节点访问同一内容时,初始请求速度会较慢(因此第一个请求文件的用户需要等待更长时间),但后续请求速度会快得多。

CDN 仅适用于会被多次访问的文件。那些访问频率较低或仅供单个用户使用的文件通常不适合使用 CDN。

每个 CDN 节点独立运行。

图 14-1。 用户直接从最近的CDN节点获取内容。CDN节点根据需要从源服务器获取内容。
图 14-1。 用户直接从最近的CDN节点获取内容。CDN节点根据需要从源服务器获取内容。

背景

CDN 模式能够有效应对以下挑战:

  • 应用程序数据可能来自距离其源数据中心较远的地理位置
  • 多个客户端访问相同的应用程序数据对象(例如 HTML、JavaScript、图像、视频或其他文件)
  • 应用程序包含大型下载、流媒体视频或其他重量级内容分发

CDN 可以有效降低其他类型节点(例如服务器)的负载,这些节点可能正在提供内容服务。

云平台优势

云平台 CDN 服务易于启用,并集成到云供应商的 Web 管理工具中,费用显示在同一账单上,并由与云平台内其他服务相同的组织提供支持。某些其他服务(例如 Blob 存储)只需点击几下鼠标即可轻松启用 CDN。因此,云 CDN 服务比直接与独立的 CDN 服务提供商合作更加便捷。

影响

可扩展性、用户体验

机制

一般来说,源数据和接收者距离越近,互联网数据传输速度越快。一种拉近源数据和接收者距离的方法是将源数据的副本缓存在距离接收者更近的位置。当用户需要数据时,从最近的缓存位置检索数据比从可能距离很远的源服务器检索数据要快得多。这种做法通常被称为边缘缓存,而 CDN 正是负责实现这一功能。我们将重点关注通过 HTTP 访问文件。

为了使 CDN 能够缓存我们的文件,我们需要做一项更改:在文件 URL 中,我们不再使用常用的域名,而是使用 CDN 提供商为我们指定的域名。所有需要 CDN 缓存的文件资源都需要更改为新的 URL 方案。

每当用户尝试访问由 CDN 管理的文件时,请求都会发送到 CDN 服务进行处理。然而,由于 CDN 服务的优势之一在于其缓存节点遍布全球各地,因此请求需要被定向到距离请求用户最近的节点。这通常通过任播路由协议来实现,该协议有助于识别最近的 CDN 节点,并据此智能地路由请求。

CDN 是一种专门的缓存,因此,它并非预先包含所有所需的文件。如果该文件之前从未通过此 CDN 节点被请求过,或者该文件已被请求但随后从 CDN 缓存中过期,则会出现这种情况。存储在 CDN 中的任何资源都有一个由您的应用程序设置的过期时间,因此您需要考虑这一点。某些资源(例如公司徽标)可能稳定存在数月甚至数年,而其他资源(例如用户个人资料照片)的保存时间可能较短,例如一小时(用户喜欢频繁更新)。过期时间通过 HTTP Cache-Control 标头来表示。由于 Cache-Control 缓存指令是一个历史悠久的互联网标准,因此 Web 浏览器可以轻松理解和处理此指令。除了单个浏览器之外,有时代理服务器或其他中间服务器也会进行缓存,从而将缓存的优势扩展到单个用户和 CDN 之外。资源过期后,CDN 会将其从缓存中移除。 (某些 CDN 服务可能还有其他行为,例如 CDN 会向源服务器检查过期内容是否确实已更改,如果未更改则继续使用缓存对象。)

如果请求的文件在 CDN 节点上不可用,CDN 服务实际上充当了中间人的角色,在后台从源服务器检索文件,将其缓存(存储)在 CDN 节点中,然后响应原始请求(此时可以成功响应)。

CDN 在用于访问频率高但很少更改的文件时才能真正发挥作用。

缓存可能不一致

CDN 会存储具有指定过期日期的资源副本;因此,缓存的图像文件可能被声明为有效期为一小时、一个月,或任何适合该资源的有效期。由于源副本的更新与 CDN 缓存副本的更新之间始终存在延迟,因此 CDN 中缓存的任何资源都可能存在过期风险。这本身并非问题,但在决定缓存哪些内容以及缓存多长时间时,需要仔细考虑这一因素。

示例:在 Windows Azure 上构建 PoP

照片页​​面 (PoP) 应用程序(前言中已介绍)将所有照片存储在 Windows Azure Blob 存储中。为了改善 PoP 用户的下载体验,所有照片下载都启用了 CDN。

在 Windows Azure Blob 存储中,单个 Blob 存储在一个Blob容器中。该容器的优势之一是为其中的 Blob 创建默认的安全上下文。只有存储在公共容器中的 Blob(公共容器是指任何知道容器内文件 URL 的用户都可以查看该文件)才有资格在 CDN 中进行缓存。

截至撰写本文时,全球共有 8 个 Windows Azure 数据中心,但 Windows Azure CDN 节点位置却有 24 个。由于纳入了更多地理位置,CDN 网络的使用极大地提升了全球覆盖范围,从而实现了更低延迟的内容分发。资源必须至少被请求过一次才能加载到 CDN 缓存中。因此,首次请求该资源的用户体验会比后续请求者差。这种情况会在每个 CDN 节点上发生,因为每个节点都需要填充自己的本地缓存。此外,当资源被请求但已从 CDN 缓存中过期时,也会重复上述过程。

PoP 照片不会频繁更改,因此当照片保存到 blob 存储时,会在单个 blob 上设置一个 Cache-Control 标头属性,并将有效期设置为一个月。如果我们需要提前更新照片,则需要更改文件名。

成本考量

Windows Azure CDN 的访问费用与直接从 Blob 存储访问相同,不收取额外的静态存储费用。除了填充 CDN 节点所需的一次额外请求的费用外,其他费用与直接从 Blob 访问完全相同。请注意,这“一次额外请求”发生在以下情况下:(a) 每个资源;(b) 每次从 Blob 存储加载资源时(包括首次加载和缓存过期后的下一次加载);(c) 访问该资源的每个 CDN 节点。

安全考量

Windows Azure CDN 仅支持缓存已公开可见的文件,因此不会降低安全性或增加攻击面。

Windows Azure CDN 支持使用 HTTP 或 HTTPS 进行访问。这主要是为了提升用户体验(因为文件已公开可见),并在用户使用 HTTPS 加载页面时发挥作用。如果 HTTPS 页面以 HTTP 方式引用图像,现代浏览器通常会显示警告,提示存在混合安全模型的问题。此类图片可以改为通过 HTTPS 访问,以改善用户体验。

其他功能

虽然本章未对此进行探讨,但还有其他与 CDN 相关的 Windows Azure 服务。例如,CDN 可以直接从 Web 角色提供文件。此外,Windows Azure 媒体服务为 Windows Azure CDN 提供视频流传输。还有其他集成服务可帮助应用程序准备媒体以供多种设备下载,例如转码服务,可确保内容在各种手机品牌和桌面操作系统上都能平等访问。

总结

为云应用程序添加 CDN 支持是低摩擦采用云服务的绝佳示例。启用 CDN 可以通过编程方式完成,也可以通过云供应商提供的 Web 管理工具进行一次性手动配置。由于其便捷性和集成性,这种方式比传统 CDN 更容易上手。

启用后,这项技术能有效降低 Web 服务器的负载,将负载分散到多个服务器上(CDN 位置远多于数据中心),同时降低网络延迟。所有这些都有助于提高可扩展性和用户体验。

在 GitHub 上查看本页或提交勘误 ↗