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

相关推荐
hai4058725 分钟前
Spring Boot中的响应与分层解耦架构
spring boot·后端·架构
Adolf_19932 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
叫我:松哥2 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap
海里真的有鱼2 小时前
Spring Boot 项目中整合 RabbitMQ,使用死信队列(Dead Letter Exchange, DLX)实现延迟队列功能
开发语言·后端·rabbitmq
工业甲酰苯胺2 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
新知图书3 小时前
Rust编程的作用域与所有权
开发语言·后端·rust
伯牙碎琴3 小时前
十一、SOA(SOA的具体设计模式)
架构
wn5314 小时前
【Go - 类型断言】
服务器·开发语言·后端·golang
希冀1234 小时前
【操作系统】1.2操作系统的发展与分类
后端
GoppViper4 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理