概览

关于 CDN 相信大家一定都不陌生,这样一个开盒即用的云计算产品无时无刻不影响我们的生活。当我们打开百度搜索,或者打开斗鱼虎牙观看直播时,我们浏览器其实都是从附近的 CDN 节点获取的网络响应。由此可以看出,CDN 在我们与服务器通信的过程中,扮演了一个中间节点的角色,但是这个中间节点与普通的路由节点又有什么具体的差异呢,让我们一起来深挖 CDN 的各种细节。

图1.spike.dev CDN 使用情况

CDN 是什么

内容分发网络(英语:Content Delivery Network或Content Distribution Network,缩写:CDN)是指一种透过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、影片、应用程序及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。

CDN 是一个分布式系统,而该系统的各个节点都具有地理上靠近用户的优势。得益于 CDN 节点的分布广泛,身处各地的用户请求不必再需要经过漫长的网络路由来获得应用服务器的响应,直接就能够通过就近的 CDN 节点就能得到结果,这样就大大缩短了网络请求的等待时延。

CDN 的工作原理

在了解了 CDN 的作用以后,CDN 是如何在整个网络请求链路过程中扮演内容分发者的角色。
首先,我们需要了解在无 CDN 参与情况下的请求响应过程:

图2. 无 CDN 参与的请求过程
  1. 用户向浏览器提供要访问的域名;
  2. 浏览器向 DNS 请求解析域名,以得到此域名对应的IP地址;
  3. 浏览器使用所得到的 IP 地址,向域名的服务主机发出数据访问请求;
  4. 浏览器根据域名主机返回的数据显示网页的内容。

在服务器主机和用户之间引入 CDN 后,对用户而言,和未引入之前不会有不同的感觉。一个简单的 CDN 网络,只需要几个 CDN 缓存服务器以及一个负载均衡 DNS 服务器就行了。流程如下:

图3. 有 CDN 参与的请求过程
  1. 用户向浏览器提供要访问的域名;
  2. 浏览器向 DNS 服务器请求解析,由于 CDN 对域名解析过程进行了调整,所以一般得到的是该域名对应的 CNAME 记录,为了得到实际 IP 地址,浏览器需要再次对获得的 CNAME 域名进行解析以得到实际的 IP 地址;在此过程中,使用的全局负载均衡 DNS 解析,如根据地理位置信息解析对应的 IP 地址,使得用户能就近访问。
  3. 此次解析得到 CDN 缓存服务器的 IP 地址,浏览器在得到实际的 IP 地址以后,向缓存服务器发出访问请求;
  4. 缓存服务器根据浏览器提供的要访问的域名,通过 Cache 内部专用 DNS 解析得到此域名的实际 IP 地址,再由缓存服务器向此实际IP地址提交访问请求;
  5. 缓存服务器从实际 IP 地址得得到内容以后,一方面在本地进行保存,以备以后使用,另一方面把获取的数据返回给客户端,完成数据服务过程;
  6. 客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览的数据请求过程。

由此可见,CDN 通过影响请求过程中的域名解析,从而实现了对用户透明的加速服务。

静态资源 vs 动态资源

A static web page (sometimes called a flat page or a stationary page) is a web page that is delivered to the user’s web browser exactly as stored,[1] in contrast to dynamic web pages which are generated by a web application.[2]
Consequently, a static web page displays the same information for all users, from all contexts, subject to modern capabilities of a web server to negotiate content-type or language of the document where such versions are available and the server is configured to do so.[3]

根据资源的更新频率以及生成方式,我们可以粗略地将服务器划分为静态资源和动态资源。简单来说,静态资源是千人一面的,是可以在不同用户之间共享的。并且静态资源的更新频率较低,因此其缓存有效期较长。其中静态资源包括图片,css 文件, js 文件以及视频等。
因此,在资源缓存有效期内,同一个 CDN 缓存节点只需访问一次应用服务器,就能响应所有用户对对应资源的请求。这极大地缓解了应用服务器地访问压力,同时也缩短了请求的响应时间。
而对于动态资源,其大部分是难以在用户间进行共享的,比如用户的个人以及购物车信息等。此时 CDN 节点需要回源请求应用服务器获得响应,然后再返回给用户。虽然这种情况下不能缓解服务器的请求压力,但是 CDN 也会采用一些措施来优化请求的响应时间:

  1. 使用 TCP 长连接,避免频繁建立短连接带来的损耗;
  2. 优化 TCP 慢启动,TCP 慢启动是防止过大流量导致网络拥塞的一种机制。TCP 通过使用滑动窗口来控制未被接收方确认的 packets 数量(发送流量)。例如微软的 Azure CDN 能够在 CDN 节点间共享带宽信息,从而优化每个节点的窗口以及 packets 设置;
  3. 优化路由。通过监控 CDN 节点到服务器主机之间的路由情况,从而在用户请求到达时选择最优的请求路径;
  4. 使用文件压缩。例如当使用手机访问高分辨率图片时,CDN 节点会自适应压缩图片大小;
  5. 资源预取。在用户请求前就 CDN 就将资源缓存在本地,从而优化首次响应时间。

CDN 的优点与缺点

优点:

  1. 高可用。CDN 能够极大地缓解服务器主机的访问压力,避免高并发场景下引发的高负载。同时,CDN 的缓存也实现了服务器资源的跨地理位置冗余,即使服务器主机已无法响应,部分请求也能被 CDN 正常响应;
  2. 内容传递速度快。得益于跨地理位置广泛分布的 CDN 节点,请求能够从就近的 CDN 服务器得到响应,这极大地缩短了请求的响应时间,提升了用户体验。

缺点:

  1. 额外的成本开销;
  2. 因为需要从 CDN 获取资源,所以需要额外的 dns 解析过程。这可能反而拖慢了响应;
  3. 在 CDN 上缓存敏感数据可能会带来安全隐患,因为 CDN 会自动将文件冗余到各个分布式节点;
  4. 当 CDN 发生故障时,可能导致你的应用无法访问。

从上面列举的缺点我们可以看出,对以下场景 CDN 不适用:

  1. 服务用户极少;
  2. 用户聚集在某个地理区域;
  3. 敏感资源。

展望

至此,我们已经对 CDN 已经有了一个基本的认识。通过跨地理位置的分布式节点,CDN 实现了网络资源的就近转发,从而极大地缓解了服务器的访问压力以及缩短了请求时延。但是,就目前而言,CDN 对于动态资源的处理能力仍然比较局限,这是因为 CDN 节点作为资源的缓存层,只是放大了应用服务器的传输能力,但不具备计算的能力。

边缘运算(英语:Edge computing),又译为边缘计算,是一种分散式运算的架构,将应用程序、数据资料与服务的运算,由网络中心节点,移往网络逻辑上的边缘节点来处理[1]。边缘运算将原本完全由中心节点处理大型服务加以分解,切割成更小与更容易管理的部分,分散到边缘节点去处理。边缘节点更接近于用户终端装置,可以加快资料的处理与传送速度,减少延迟。在这种架构下,资料的分析与知识的产生,更接近于数据资料的来源,因此更适合处理大数据。

在此,我们不得不提到边缘计算。同样作为跨地理位置的分布式系统,边缘计算提供了与应用服务器一致的计算能力。用户的动态资源访问请求可直接由边缘计算节点响应并访问。目前,Akamai 已经提供了对 CDN 节点定义 js 脚本来处理动态资源的功能。
那么,对于边缘计算这种分布式系统又是如何保证一致性,可用性以及处理网络分区的问题?下节我们将继续讨论关于分布式系统这 3 大焦点。

本文参考

  1. https://docs.microsoft.com/en-us/azure/cdn/cdn-dynamic-site-acceleration
  2. https://internetdevels.com/blog/pros-and-cons-of-cdn
  3. https://www.accuwebhosting.com/blog/cdn-pros-cons-explained/
  4. https://www.cnblogs.com/losbyday/p/5843960.html