什么是CDN?用了CDN一定会更快吗?

文章目录

  • 前言
  • CDN是什么?
  • CDN的工作原理
    • 为什么要加个CNAME那么麻烦?
    • 怎么知道哪个服务器IP里调用方最近?
  • 回源是什么
    • 回源是什么?
    • 那还有哪些情况会发生回源呢?
  • 怎么判断是否发生回源
  • 用了CDN一定比不用的更快吗?
  • 什么情况下不应该使用CDN?
      • 什么情况下不应该使用CDN?
  • 总结
  • 参考

看到了小白的文章, 为了加深印象自己来整理一下

前言

对于开发同学来说,CDN这个词,既熟悉又陌生。
平时搞开发的时候很少需要碰这个,但却总能听到别人提起。
我们都听说过它能加速,也大概知道个原因,但是往深了问。用了CDN就一定比不用更快吗?
就感觉有些懵了。但没关系,今天我们换个角度重新认识下CDN。

CDN是什么?

对于数字和文本类型的数据,比方说名字和电话号码相关的信息。我们需要有个地方存起来。我们通常会用mysql数据库去存。
文本存在mysql中
当我们需要重新将这一数据取出的时候,就需要去读mysql数据库。但因为mysql的数据是存在磁盘上的,单台实例,读性能到差不多5kqps就已经很不错了。

看起来还凑合,但对于稍微大一点的系统,就稍微有点捉急了。
为了提升点性能,我们在mysql之前再加一层内存做缓存层,比如常说的redis,读数据优先到内存里读,读不到才到mysql里读,大大减少了读mysql的次数。有了这套组合拳,读性能轻松上万qps。
mysql和redis
到这里,我们说的都是我们平时比较容易接触的开发场景。

但如果现在我要处理的,不再是上面提到的文本类数据,而是图片数据。

那么问题来了。这张图片数据应该存在哪?,又该从哪里读?

我们回过头去看mysql和redis的场景,无非就是存储层加缓存层。

存储层和缓存层
对于图片这样的文件对象,存储层不太可能再用mysql,应该改用专业的对象存储,比如亚马逊的S3(Amazon Simple Storage Service,注意后面是三个S开头的单词,所以叫s3),或者阿里云的oss(Object Storage Service)

下面的内容,我们就用比较常见的oss去做解释。

而缓存层,也不能继续用redis了,需要改成使用CDN(Content Delivery Network,内容分发网络)可以将CDN简单理解为对象存储对应的缓存层
CDN和OSS
现在就可以回答上面的提问,对用户来说,这张图片数据存在了对象存储那,当有需要的时候,会从CDN那被读出来。

CDN的工作原理

有了CDN和对象存储之后,现在我们来看下他们之间是怎么工作的。

我们平时看到的图片,可以右键复制查看它的URL。
在这里插入图片描述
会发现图片的URL长这样。https://cdn.xiaobaidebug.top/1667106197000.png

其中前面的cdn.xiaobaidebug.top就是CDN的域名,后面的1667106197000.png是图片的路径名。

当我们在浏览器输入这个URL就会发起HTTP GET请求,然后经历以下过程。
在这里插入图片描述
第一阶段: 你的电脑会先通过DNS协议获得cdn.xiaobaidebug.top 这个域名对应的IP。

  • step1和step2:先查看浏览器缓存,再看操作系统里的/etc/hosts 缓存,如果都没有,就会去询问最近的DNS服务器(比如你房间里的家用路由器)。看看最近的DNS服务器上有没有对应的缓存,如果有则返回。
  • step3:如果最近的DNS服务器上没有对应的缓存,就会去查询根域,一级域,二级域,三级域服务器
  • step4:然后,最近的DNS服务器会得到这个cdn.xiaobaidebug.top 域名的别名(CNAME),比如cdn.xiaobaidebug.top.w.kunlunaq.com .
  • kunlunaq.com是阿里CDN专用的DNS调度系统
  • step5到step7:此时最近的DNS服务器会去请求这个kunlunaq.com ,然后返回一个离你最近的IP地址返回给你。

第二阶段: 对应上图里的step8。浏览器拿着这个IP去访问cdn节点,然后,cdn节点返回数据。

上面第一阶段流程里,提到了很多新的名词,比如CNAME,根域,一级域啥的,可以自行查阅资料了解一下.

我们知道DNS的目的就是通过域名去获得IP地址。但这只是它的众多功能之一。

DNS消息有很多种类型,其中A类型,就是用 域名 去查 域名对应的IP地址。而CNAME类型,则是用 域名 去查 这个域名的别名
在这里插入图片描述
对于普通域名,DNS解析后一般就能直接得到域名对应的IP 地址(又叫A类型记录,A指Address)。

比如下面,用dig命令发出DNS请求并打印过程数据。

$ dig +trace xiaobaidebug.top
;; ANSWER SECTION:
xiaobaidebug.top. 600 IN A 47.102.221.141

可以看到xiaobaidebug.top直接解析得到对应的IP地址47.102.221.141

但对于cdn域名,一波查询下来,先得到的却是一条CNAME的记录xx.kunlunaq.com,然后dig这个xx.kunlunaq.com才能得到对应的IP地址。

$ dig +trace cdn.xiaobaidebug.top
cdn.xiaobaidebug.top. 600 IN CNAME cdn.xiaobaidebug.top.w.kunlunaq.com.$ dig +trace cdn.xiaobaidebug.top.w.kunlunaq.com
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.243
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.241
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.244
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.249
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.248
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.242
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.250
cdn.xiaobaidebug.top.w.kunlunaq.com. 300 IN A 122.228.7.251

看到这里,问题就又来了。

为什么要加个CNAME那么麻烦?

CNAME里指向的,其实是CDN专用的DNS域名服务器,它对整个DNS体系来说,只是其中一台小小的DNS域名服务器,看起来就跟其他域名服务器一样,平平无奇。DNS请求也会正常打入这个服务器里。

但当请求真正打到它上面的时候,它的特别之处就体现出来了,当查询请求打入域名服务器时,普通的DNS域名服务器返回域名对应的部分IP就够了,但CDN专用的DNS域名服务器却会要求返回离调用方"最近的"服务器IP。
CDN专用的DNS解析服务器会返回就近的CDN节点IP

怎么知道哪个服务器IP里调用方最近?

可以看到"最近"这个词其实是加了双引号的

CDN专用的DNS域名服务器其实是CDN提供商提供的,比如阿里云当然知道自己的的CDN节点有哪些,以及这些CDN服务器目前的负载情况和响应延时甚至权重啥的,并且也能知道调用方的IP地址是什么,可以通过调用方的IP知道它所属的运营商以及大概所在地,根据条件筛选出最合适的CDN服务器,这就是所谓的"最近"

举个例子。假设地理位置最近的CDN机房流量较多,响应较慢,但地理位置远一些的服务器却能更好的响应当前请求,那按理说可能会选择地理位置远一些的那台CDN服务器。

也就是说,选出来的服务器不一定在地理位置最近,但一定是当前最合适的服务器

回源是什么

上面的图片URL,是https://cdn域名/图片地址.png的形式。也就是说这张图片是访问CDN拿到的。

那么,直接访问对象存储能不能拿到图片数据并展示?比如像这样。https://oss域名/图片地址.png

这就像问,不走redis,直接从mysql中能不能读取到文本数据并展示一样。当然能。

但这样成本更高,这里的成本,可以指性能成本,也可以指调用成本。看下面这个图。
在这里插入图片描述
可以看到直接请求oss的费用差不多是通过cdn请求oss的两倍,考虑到家境贫寒,同时也为了让博客获取图片的速度更快,就接入了CDN。

但看到这里,问题又又来了。上面的截图里,红框里有个词叫"回源"。

回源是什么?

当我们访问https://cdn域名/图片地址.png时,请求会打到cdn服务器上面。

但cdn服务器本质上就是一层缓存,并不是数据源,对象存储才是数据源

第一次访问cdn获取某张图片时,大概率在cdn里并没有这张图片的数据,因此需要回到数据源那去取出这份图片数据。然后再放到cdn上。下次再次访问cdn时,只要缓存不过期,就能命中缓存直接返回,这就不需要再回源。

于是访问的过程就变成了下面这样。
在这里插入图片描述

那还有哪些情况会发生回源呢?

除了上面提到的cdn上拿不到数据会回源站外,还有cdn上的缓存过期失效了也会导致回源站。

另外,就算有缓存,且缓存不过期,也可以通过cdn提供的开放接口来触发主动回源,但这个我们比较少机会能接触到。

另外,回源这个事情,其实用户是感知不到的,因为用户去读图片的时候,只能知道自己读到了还是读不到。

同样是读到了,还细分为是从cdn那直接读的,还是cdn回源读对象存储之后返回的
有缓存直接返回和没缓存回源的区别

那么,**我们有办法判断是否发生过回源吗?**有。我们接着往下看。

怎么判断是否发生回源

我们以某里云的对象存储和CDN为例。

假设我要请求下面这张图https://cdn.xiaobaidebug.top/image/image-20220404094549469.png

为了更方便的查看响应数据的http header,我们可以用上postman

通过GET方法去请求图片数据。

然后通过下面的tab切换查看response header信息。
查看response header述
回源的情况
此时查看response header下的X-Cache的值是MISS TCP_MISS。意思是未命中缓存导致CDN回源查oss,拿到数据后再返回。

那此时CDN里肯定是有这张图片的缓存了。我们可以试着再执行一次 GET 方法获取图片。
在这里插入图片描述
X-Cache的值就变成了HIT TCP_MEM_HIT,这就是命中缓存了。

这个是某里云的做法,其他比如腾某云啥的,也都大差不差,几乎都可以从response header里找到相关的信息。

用了CDN一定比不用的更快吗?

看到这里我们就可以回答文章开头的问题了。

如果没有接入CDN,直接访问源站,流程是这样的。
在这里插入图片描述
但如果接入了CDN,且CDN上没有缓存数据,那就会触发回源。
在这里插入图片描述
相当于在原来的流程上还多了一层CDN的调用流程。

也就是,用了CDN时,未命中CDN缓存导致回源,就会比不用的时候更慢。

未命中缓存,可能是cdn里压根就没这一数据,也可能是曾经有这条数据但后来过期失效了

这两种情况都正常,大部分时候并不需要做任何处理

但对于极个别场景,我们可能需要做些优化。比如你们源站数据有大版本更新,就像更换cdn域名啥的,那在上线的那一刻用户全用新cdn域名去请求图片啥的,新CDN节点基本上百分百触发回源,严重的时候甚至可能会拖垮对象存储。这时候你可能需要提前将热点数据筛选出来,利用工具预先请求一波,让CDN加载上热数据缓存。比如某里云上的CDN就有这样的"刷新预热"功能。
在这里插入图片描述

当然也可以通过灰度发布的模式,先让少量用户体验新功能,让这些用户把cdn"热"起来,然后再逐步放开流量。

还有就是曾经有这条数据但后来过期失效了,对于热点数据,可以适当提高一下cdn数据的缓存时间
在这里插入图片描述

什么情况下不应该使用CDN?

从上面的描述看下来,CDN最大的优势在于,对于来自世界各地的用户,它可以就近分配CDN节点获取数据,并且多次重复获取同一个文件数据的时候,有缓存加速的作用。

这对于网页图片这样的场景,是再合适不过了。因为底层用的是对象存储,也就是说,只要是文件对象,比如视频啥的,都可以用这套流程接入cdn做加速。比如平时刷的某音某手短视频就是这么干的。

那反过来想想,问题就来了。

什么情况下不应该使用CDN?

如果你有一个公司内网的服务,并且服务请求的图片等文件不太可能被多次重复调用,这时候其实没必要使用CDN。

注意上面两个加粗了的关键点。

  • 内网服务,是为了保证你是了解服务的请求来源的,也能拿到对象存储的读权限,并且如果你的对象存储也是公司内部的,那大概率跟你的服务已经在同一个机房里,这已经很近了。接入CDN也享受不到"就近分配CDN节点"所带来的好处。
  • 图片或其他文件不太可能被多次重复使用,如果接入了CDN,那你每次去访问CDN获取图片的时候,CDN节点上大概率没有你要的数据,相当于每次都需要回源到对象存储去取一把。那接入CDN相当于给自己加了一层代理,多一层代理,就多一层耗时。
    在这里插入图片描述
    关于上面的第二点,如果你需要一个明确的指标去说服自己,那我可以给你一个。从上面的介绍内容,我们知道,可以通过cdn响应的http header中的X-Cache字段,看到一个请求是否触发过回源,统计次数,再除以总的请求数,就能得到回源的比例,比如回源比例高达90%,那还接啥cdn。

总结

  • 对于文本类数据我们习惯用mysql做存储,redis做缓存。但属于文件类数据,比如视频图片,则需要使用oss等做对象存储,cdn做缓存
  • 用了CDN如果发生回源,那实际上会比不用的时候更慢一些。
  • CDN最大的优势在于,对于来自世界各地的用户,它可以就近分配CDN节点获取数据,并且多次重复获取同一个文件数据的时候,有缓存加速的作用。如果你的服务和对象存储都在内网,并且文件数据也不太会有重复使用的可能性,那其实没必要接入cdn。

参考

侵删
来自微信公众号: 小白debug
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光伏电站全貌

光伏电站 简介 每一篇文章开篇我都会写一个内容简介,一来梳理自己的写作思路,二来方便读者整体了解文章写作意图和脉络。本篇是新能源方面的开篇之作,我选取了介绍光伏电站基础知识,首先我们要了解光伏电站基础分类,然…

PHP基础 - 运算符

算术运算符 运算符描述实例+加法$x = 2 + 2; echo $x;-减法$x = 5 - 3; echo $x;*乘法$x = 4 * 3; echo $x;/除法$x = 10 / 2; echo $x;%取余$x = 15 % 4; echo $x;++自增$x = 5; $x++; echo $x;--自减$x = 5; $x--; echo $x;算术运算符的使用场景: 1)加法运算符 +:用于将两…

Copilot的11个新功能,你不能错过!

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 文章目录 1. PowerPoint2. Excel3. One Note4. Word5. 必应聊天现在变为Copilot6. GPT-4为Copilot聊天提供动力7. Microsoft Teams8. Outlook9. Copilot Studio10.…

磁盘存储器

目录 1.1 磁盘存储器1.2 磁盘的性能指标1.3 磁盘存储器(续)1.4 磁盘阵列 \quad \quad \quad 左南右北为0 左北右南为1 \quad \quad 1.1 磁盘存储器 \quad 磁盘的驱动器 \quad 磁盘的控制器 \quad 主机每次对磁盘进行读和写操作都是以扇区为单位的 现在比较流行的是SATA标准 \…

【kafka实践】12|如何实现exactly once

前面的章节中我们聊到如何避免保证消息丢失,没有印象的同学可以再看看,本节我们将展开如何实现kafka的一次精确。 首先我们需要明白两个概念“幂等”和“事物” 幂等 “幂等”这个词原是数学领域中的概念,指的是某些操作或函数能够被执行多…

基于SpringBoot 2+Layui实现的管理后台系统源码+数据库+安装使用说明

springboot-plus 一个基于SpringBoot 2 的管理后台系统,包含了用户管理,组织机构管理,角色管理,功能点管理,菜单管理,权限分配,数据权限分配,代码生成等功能 相比其他开源的后台系统&#xff0…

vue 实现返回顶部功能-指定盒子滚动区域

vue 实现返回顶部功能-指定盒子滚动区域 html代码css代码返回顶部显示/隐藏返回标志 html代码 <a-icontype"vertical-align-top"class"top"name"back-top"click"backTop"v-if"btnFlag"/>css代码 .top {height: 35px;…

令牌桶算法理解学习(限流算法)

令牌桶算法是网络流量整形&#xff08;Traffic Shaping&#xff09;和速率限制&#xff08;Rate Limiting&#xff09;中最常使用的一种算法。典型情况下&#xff0c;令牌桶算法用来控制发送到网络上的数据的数目&#xff0c;并允许突发数据的发送。 用简单的话语来说就是限制…

Vscode中配置SSH

方法&#xff1a; 本地生成秘钥&#xff0c;并将生成的秘钥保存在服务器上 步骤&#xff1a; 一、用户端生成秘钥 1、在cmd中输入ssh-keygen -t rsa&#xff0c;一直点回车即可 2、打开生成的秘钥文件&#xff08;位置&#xff1a;C:\Users\用户名\.ssh\id_rsa.pub&#x…

【Java】BigInteger用法

前言 在Java中&#xff0c;由于没有long long类型。如果需要使用比long类型更大的整数数据时&#xff0c;就可以使用BigInteger类&#xff0c;它支持任意精度的整数。 创建BigInteger类型数据 Test public void test1() {Scanner scan new Scanner(System.in);//1.控制台读…

leetcode做题笔记2048. 下一个更大的数值平衡数

如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0c;请你返回 严格大于 n 的 最小数值平衡数 。 示例 1&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;22 解释&a…

Linux中的SNAT与DNAT实践

Linux中的SNAT与DNAT实践 1、SNAT的介绍1.1&#xff0c;SNAT概述1.2&#xff0c;SNAT源地址转换过程1.3&#xff0c;SNAT转换 2、DNAT的介绍2.1&#xff0c;DNAT概述2.2&#xff0c;DNAT转换前提条件2.3&#xff0c;DNAT的转换 3、防火墙规则的备份和还原4、tcpdump抓包工具的运…

腾讯再推互动微短剧,游戏的风吹向了短剧

当你看剧时不再拥有上帝视角&#xff0c;处在女主的位置上&#xff0c;你又会做出什么样的选择&#xff1f; 腾讯最新上线的短剧《摩玉玄奇2》在原版之外还推出了互动版&#xff0c;就给出了这样一个新玩法。 《摩玉玄奇2》原版是普通的后宫职场微短剧&#xff0c;互动版则是…

虚拟机VMware安装centos以及配置网络

目录 1、CentOS7的下载2、CentOS7的配置3、CentOS7的安装4、CentOS7的网络配置 4.1、自动获取IP4.2、固定获取IP 5、XShell连接CentO 准备工作&#xff1a;提前下载和安装好VMware。VMware的安装可以参考这一篇文章&#xff1a;VMware15的下载及安装教程。 1、CentOS7的下载 …

qt 字符串操作

在 QT 中&#xff0c;你可以使用QString类来操作字符串。QString是一个模板类&#xff0c;它可以存储不同字符集的字符串&#xff0c;并且提供了许多用于操作字符串的方法。 以下是一些常见的操作字符串的方法&#xff1a; append()方法&#xff1a;将一个字符串附加到QString的…

从零开始搭建企业管理系统(五):统一响应结果和全局异常处理

统一响应结果和全局异常处理 前言统一响应结果定义响应结构定义响应对象定义响应状态对象统一返回响应对象定义 Controller 拦截类 全局异常处理 前言 做个功能之前我们想一下为什么要做统一响应结果和全局异常处理呢&#xff1f; 这是因为我们的项目采用的是前后端分离开发&am…

【C++】小项目:C++实现通讯录管理系统

文章目录 1、系统需求完整代码 1、系统需求 本文将利用C来实现一个通讯录管理系统 系统中需要实现的功能如下&#xff1a; 添加联系人&#xff1a;向通讯录中添加新人&#xff0c;信息包括&#xff08;姓名、性别、年龄、联系电话、家庭住址&#xff09;最多记录1000人显示联…

LVGL | Demo实例使用说明

LVGL | Demo实例使用说明 时间&#xff1a;2023年12月10日21:51:17 文章目录 LVGL | Demo实例使用说明Demos for LVGLAdd the examples to your projectsDemosWidgetsMusic playerKeypad and encoderBenchmarkStress Contributing Demos for LVGL Add the examples to your p…

基于SSM的酒店管理旅店系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

华为OD机试真题-密码输入检测-2023年OD统一考试(C卷)

题目描述&#xff1a; 给定用户密码输入流input&#xff0c;输入流中字符<表示退格&#xff0c;可以清除前一个输入的字符&#xff0c;请你编写程序&#xff0c;输出最终得到的密码字符&#xff0c;并判断密码是否满足如下的密码安全要求。 密码安全要求如下&#xff1a; …