1. CDN访问示例
基于CDN的访问示例如下:
● 源站在北京
● 为了加快全国各省地市的访问速度,建了6个CDN中心,静态资源从源站复制到各个CDN中心
● 各个地市通过最近的CDN中心访问静态资源,由于物理距离变短,访问速度提升。
2. CDN从哪些方面提升性能
CDN可以从以下方面提升性能:
● 减少延迟
通过减少用户和服务器之间的物理距离,CDN可以显著减少网站加载时间和视频缓冲。
网络时延参考:
访问方式 | 时延 |
---|---|
本机 | 0.01ms |
同机房机器 | 0.1ms |
同城机器 | 1ms |
不同城机器 | 20ms |
南北方机器 | 50ms |
国内到国外 | 200ms |
延时体验:
时延 | 级别 | 体验 |
---|---|---|
1~30ms | 极好 | 几乎察觉不出有延迟 |
31~50ms | 较好 | 没有明显延迟 |
51~100ms | 一般 | 有明显延迟 |
>100ms | 差 | 丢包、掉线 |
● 减少服务器负载
CDN通过将请求分散到多个服务器,可以有效地分散流量负载,总体上减少了网络延迟和服务器负载,提高了响应速度。
● 域名分片
在HTTP/1.1中,浏览器通常限制对同一域名的并发连接数(通常是6个)。通过使用多个子域名来托管网站资源(如images1.example.com, images2.example.com等),可以增加浏览器的并发连接数。
CDN可以自动处理域名分片,将内容分布到多个子域名上,从而提高并发性和加载速度。
● 内容压缩
CDN通常提供自动内容压缩功能,减少了通过网络传输的数据量,在相同的带宽下可以加载更多的内容,在一定程度上缓解了并发连接数的限制。
3. CDN主要技术
3.1 CDN如何做到地理位置感知
CDN通过如下过程做到地理位置感知:
● DNS查询
当用户尝试访问某个网站时,设备首先会向DNS服务器发起请求,以获取该网站对应的IP地址,这个DNS查询会被发送到用户的ISP(互联网服务提供商)或者公共DNS服务器,然后这些DNS查询会发送到智能DNS服务器。
● 智能DNS解析
智能DNS服务器会分析用户请求的源IP地址,每个IP地址都与地理位置(例如国家、城市)相关联,从而推断出用户的大致地理位置。
CDN提供商通常会拥有一个IP地址数据库,用于将IP地址映射到地理位置。
● 选择最近的服务器
一旦确定用户的大致位置,智能DNS服务器就会将用户的请求重定向到距离用户最近的CDN边缘服务器,这通常基于网络延迟、服务器的负载情况和内容可用性决定。
● 响应用户请求
选定的边缘服务器随后向用户的设备提供请求的内容,如网页、图像或视频,由于服务器离用户更近,内容的交付速度更快,延迟更低。
3.2 如何做到就近访问智能DNS服务器
当智能DNS服务器的位置离用户很远时,可能影响到DNS查询的速度和效率,为了解决这个问题,CDN提供商通常采用以下策略来确保用户能就近访问智能DNS服务器:
● 全球分布的DNS服务器
CDN提供商在全球范围内部署了DNS服务器网络,无论用户身在何处,都有一个相对较近的DNS服务器可以处理他们发起的DNS查询。
● 任播技术(Anycast)
CDN提供商利用任播(Anycast)技术来路由DNS查询,在任播网络中,同一个IP地址被赋予网络中的多个DNS服务器。
当用户发起DNS查询时,这个查询会被自动路由到最近的(即网络延迟最小的)DNS服务器。
● 地理位置感知路由
使用地理位置感知路由技术,可以根据用户的地理位置和网络拓扑结构来确定最优的路由路径。
● DNS缓存
本地ISP或用户的路由器通常会缓存DNS查询的结果,减少对智能DNS服务器的重复查询。
当其他用户尝试访问相同的域名时,可以直接使用缓存的结果,从而减少对远程DNS服务器的访问需求。
3.3 CDN如何更新静态资源?
● 资源更新
网站管理员或内容提供者首先在原始服务器上更新静态资源,如HTML文件、CSS样式表、JavaScript文件、图像等。
● CDN缓存失效和更新
CDN需要知道原始服务器上的内容何时更新,以便同步这些更新到其分布在全球的边缘节点,一般通过以下方式之一实现:
方式 | 描述 |
---|---|
定期检查 | CDN可以定期(例如,每小时或每天)检查原始服务器上的内容,查看是否有更新。 |
缓存失效 | 在某些情况下,内容提供者可以手动触发一个缓存失效的过程,告诉CDN有特定文件已经更新,需要刷新缓存。 |
使用缓存头 | 原始服务器可以通过HTTP头(如Cache-Control)指定资源的有效期,CDN会根据这些头信息来决定何时从原始服务器获取新的副本。 |
● 获取最新内容 一旦CDN知道内容已更新,它将从原始服务器获取最新的内容副本。
● 分发更新到边缘节点
更新后的内容被分发到CDN的边缘节点,这个过程可以是即时的,也可能根据网络状况和边缘节点的使用情况逐渐进行。
● 新请求获取最新内容
当用户发起请求时,会从最近的边缘节点获取到最新的内容,如果边缘节点上的内容仍然是旧的,节点会从原始服务器或其他边缘节点获取最新版本的内容。
● 缓存预热(Cache Warming)
在某些情况下,CDN可能会执行所谓的"缓存预热",即在内容正式发布之前,CDN就已经开始获取并分发新内容到边缘节点。
4. 个人博客是否需要使用CDN?
可以从以下方面来考虑是否使用CDN:
● 访问者地理位置造成的时延
如果博客的大部分访问者地址位置造成的时延并不高,并在可接受范围内,则不需要使用CDN。
一般个人博客静态资源的时延可以优先通过其他手段解决,例如压缩,拆包,使用外链视频等等。
有的特殊场景,例如从国外访问站点时延超过6秒,这种情况可结合用户量来考虑,如果量大,可以在国外单独部署一套服务器,如果量很小,一般也不会管。
● 流量
如果流量不大,不是很有必要,从实际需要出发,不是什么都要具备。
● 成本
是否有CDN提供商提供免费或成本低廉的方案,例如CDN成本低于增加服务器带宽成本和扩容成本,而通过增加带宽和扩容可以降低访问时延。
● 博客内容类型
如果博客包含大量的媒体文件(如图片、视频),CDN可以加快这些内容的加载速度。
5. 总结
CDN最大的提速优势是就近访问,其他几点如减少负载、域名分片以减少连接数、压缩等,即使没有CDN,通过其他方式也能做到,所以,CDN可作为最后的优化手段,不需要一上来就使用CDN。
对于个人博客,特别是单页应用,一般只要解决首屏延迟在2秒内,基本可以不需要使用CDN。不要小看这2秒,由于使用各种组件导致js脚本,css脚本过大,加上个人博客通常所租用的带宽并不会太高,很容易超过2秒。
其他阅读:
如何编写软件设计文档
Spring Cache架构、机制及使用
布隆过滤器适配Spring Cache及问题与解决策略
JAVA编程思想(一)通过依赖注入增加扩展性
JAVA编程思想(二)如何面向接口编程
JAVA编程思想(三)去掉别扭的if,自注册策略模式优雅满足开闭原则
Java编程思想(七)使用组合和继承的场景
JAVA基础(一)简单、透彻理解内部类和静态内部类
JAVA基础(二)内存优化-使用Java引用做缓存
JAVA基础(三)ClassLoader实现热加载
JAVA基础(五)函数式接口-复用,解耦之利刃