CDN提速原理和主要技术

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基础(五)函数式接口-复用,解耦之利刃

相关推荐
尚学教辅学习资料7 分钟前
基于SpringBoot的医药管理系统+LW示例参考
java·spring boot·后端·java毕业设计·医药管理
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng1 小时前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
W Y1 小时前
【架构-37】Spark和Flink
架构·flink·spark
Gemini19952 小时前
分布式和微服务的区别
分布式·微服务·架构
paopaokaka_luck6 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风7 小时前
详解K8S--声明式API
后端
Peter_chq7 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml48 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍