Java笔记 ·

CDN静态资源加速

静态资源访问的关键点是就近访问。可以考虑在业务服务器的上层加一层特殊缓存,即CDN。

CDN(Content Delivery Network/Content Distribution Network,内容分发网络)。简单来说,CDN 就是将静态的资源分发到,位于多个地理位置机房中的服务器上,因此它能很好地解决数据就近访问的问题,也就加快了静态资源的访问速度。

搭建一个CDN系统需要考虑两点:

  • 如何将用户请求映射到CDN节点。
  • 如何根据用户的地理位置找到比较近的节点。

将请求映射到节点

可以通过DNS解决域名映射的问题。

DNS(Domain Name System,域名系统)实际上就是一个存储域名和IP地址对应关系的分布式数据库。

域名解析的结果一般有两种:

  • 一种叫做“A 记录”,返回的是域名对应的 IP 地址;
  • 另一种是“CNAME 记录”,返回的是另一个域名

DNS 分为很多种,有根 DNS,顶级 DNS 等等。除此之外还有两种 DNS 需要特别留意:

  • 一种是 Local DNS,它是由你的运营商提供的 DNS,一般域名解析的第一站会到这里
  • 另一种是权威 DNS,它的含义是自身数据库中存储了这个域名对应关系的 DNS

域名解析过程是分级的,每一级有专门的域名服务器承担解析的职责。DNS解析过程需要做本地缓存,降低DNS解析过程的响应时间。一个具体的解决思路如下:

  • 在 APP 启动时,对需要解析的域名做预先解析,然后把解析的结果缓存到本地的一个 LRU 缓存里面。
  • 当要使用这个域名的时候,从缓存中直接拿到所需要的 IP 地址,如果缓存中不存在才会走整个 DNS 查询的过程。
  • 为了避免 DNS 解析结果的变更造成缓存内数据失效,可以启动一个定时器,定期地更新缓存中的数据。

找到离用户最近的节点

GSLB (Global Server Load Balance,全局负载均衡)可以给用户返回一个离着他更近的节点,加快静态资源的访问速度。

GSLB 的含义是对于部署在不同地域的服务器之间做负载均衡,下面可能管理了很多的本地负载均衡组件。其有两方面作用:
- 它是一种负载均衡服务器,让流量平均分配使得下面管理的服务器的负载更平均。
- 保证流量流经的服务器与流量源头在地缘上是比较接近的。

是否能够从 CDN 节点上获取到资源还取决于 CDN 的同步延时

一般会通过CDN厂商的接口将静态资源写入某一节点,然后通过内部同步机制分散同步到每一个节点。这个同步过程存在延迟,一旦无法获取到就不得不从源站获取。所以在使用CDN时需要关注CDN的命中率和源站的带宽情况

参考资料

高并发系统设计40问

参与评论