本文为社区首发签约文章,14天内制止转载,14天后未获授权制止转载,侵权必究!

关于开发同学来说,CDN这个词,既熟悉又陌生。

平常搞开发的时分很少需求碰这个,但却总能听到他人提起。

咱们都听说过它能加快,也大约知道个原因,但是往深了问。

用了CDN就一定比不必更快吗?

就感觉有些懵了。但没关系,今天咱们换个角度从头认识下CDN。

CDN是什么

关于数字和文本类型的数据,比方说名字和电话号码相关的信息。咱们需求有个地方存起来。

咱们一般会用mysql数据库去存。

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

当咱们需求从头将这一数据取出的时分,就需求去读mysql数据库。

但因为mysql的数据是存在磁盘上的,单台实例,读功能到差不多5kqps就现已很不错了。

看起来还凑合,但关于略微大一点的系统,就略微有点捉急了。

为了提升点功能,咱们在mysql之前再加一层内存做缓存层,比方常说的redis,读数据优先到内存里读,读不到才到mysql里读,大大减少了读mysql的次数。有了这套组合拳,读功能轻松上万qps。

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

好了,到这儿,咱们说的都是咱们平常比较简略触摸的开发场景。

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

比方,我有一张帅气的照片。就下面这张。

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

每次刷某音听到有人翻唱蔡健雅的《letting go》的时分,我都不由得想发这张图。

并配文”仍是忘不了”。


那么问题来了。

这张图片数据应该存在哪?,又该从哪里读?

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

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

关于图片这样的文件目标存储层不太或许再用mysql,应该改用专业的目标存储,比方亚马逊的S3(Amazon Simple Storage Service,留意后边是三个S最初的单词,所以叫s3),或许阿里云oss(Object Storage Service)。下面的内容,咱们就用比较常见的oss去做解说。

缓存层,也不能持续用redis了,需求改成运用CDNContent Delivery Network,内容分发网络)。

能够将CDN简略理解为目标存储对应的缓存层。

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

现在就能够回答上面的提问,对用户来说,这张图片数据存在了目标存储那,当有需求的时分,会从CDN那被读出来。

CDN的作业原理

有了CDN和目标存储之后,现在咱们来看下他们之间是怎样作业的。

咱们平常看到的图片,能够右键复制检查它的URL。

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

会发现图片的URL长这样。

https://www.6hu.cc/files/2022/12/1671152864-ae336cb3978b455.png

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

当咱们在浏览器输入这个URL就会建议HTTP GET恳求,然后经历以下进程。

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

第一阶段: 你的电脑会先经过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中有哪些值得学习的优秀设计」有很详细的描绘,假如不了解的话能够去看下。


咱们知道DNS的意图便是经过域名去取得IP地址

但这仅仅它的很多功能之一。

DNS音讯有许多种类型,其间A类型,便是用域名去查域名对应的IP地址。而CNAME类型,则是用域名去查这个域名的别号

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

关于一般域名,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就一定比不用更快吗?


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

能够看到”最近”这个词其实是加了双引号的。

CDN专用的DNS域名服务器其实是CDN提供商提供的,比方阿里云当然知道自己的的CDN节点有哪些,以及这些CDN服务器目前的负载状况和呼应延时乃至权重啥的,而且也能知道调用方的IP地址是什么,能够经过调用方的IP知道它所属的运营商以及大约所在地,根据条件挑选出最适宜的CDN服务器,这便是所谓的”最近“。

举个例子。假定地理位置最近的CDN机房流量较多,呼应较慢,但地理位置远一些的服务器却能更好的呼应当时恳求,那按理说或许会挑选地理位置远一些的那台CDN服务器。

也便是说,选出来的服务器纷歧定在地理位置最近,但一定是当时最适宜的服务器。


回源是什么

上面的图片URL,是的方式。

也便是说这张图片是拜访CDN拿到的。

那么,直接拜访目标存储能不能拿到图片数据并展现?

比方像下面这样。


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

当然能。

我之前放在博客里的图片便是这么干的。

但这样本钱更高,这儿的本钱,能够指功能本钱,也能够指调用本钱。看下下面这个图。

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

能够看到直接恳求oss的费用差不多是经过cdn恳求oss的两倍,考虑到家境贫寒,同时也为了让博客获取图片的速度更快,我就接入了CDN。

但看到这儿,问题又又来了。

上面的截图里,红框里有个词叫”回源“。

回源是什么?

当咱们拜访时,恳求会打到cdn服务器上面。

但cdn服务器本质上便是一层缓存,并不是数据源,目标存储才是数据源

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

所以拜访的进程就变成了下面这样。

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

那还有哪些状况会产生回源呢?

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

别的,就算有缓存,且缓存不过期,也能够经过cdn提供的开放接口来触发主动回源,但这个咱们比较少时机能触摸到。


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

同样是读到了,还细分为是从cdn那直接读的,仍是cdn回源读目标存储之后回来的

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

那么,咱们有办法判别是否产生过回源吗?

有。咱们接着往下看。


怎样判别是否产生回源

咱们以某里云的目标存储和CDN为例。

假定我要恳求下面这张图https://www.6hu.cc/files/2022/12/1671152868-b8c5e30d07d5d8e.png

为了更便利的检查呼应数据的http header,咱们能够用上postman

经过GET方法去恳求图片数据。

然后经过下面的tab切换检查response header信息。

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

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

此刻检查response header下的X-Cache的值是 MISS TCP_MISS。意思是未射中缓存导致CDN回源查oss,拿到数据后再回来。

那此刻CDN里肯定是有这张图片的缓存了。咱们能够试着再执行一次 GET 方法获取图片。

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

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,那你每次去拜访CDN获取图片的时分,CDN节点上大约率没有你要的数据,相当于每次都需求回源到目标存储去取一把。那接入CDN相当于给自己加了一层署理,多一层署理,就多一层耗时。

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

关于上面的第二点,假如你需求一个清晰的目标去说服自己,那我能够给你一个。从上面的介绍内容,咱们知道,能够经过cdn呼应的http header中的X-Cache字段,看到一个恳求是否触发过回源,统计次数,再除以总的恳求数,就能得到回源的份额,比方回源份额高达90%,那还接啥cdn。

总结

  • 关于文本类数据咱们习惯用mysql做存储,redis做缓存。但属于文件类数据,比方视频图片,则需求运用oss等做目标存储,cdn做缓存。
  • 用了CDN假如产生回源,那实际上会比不必的时分更慢一些。
  • CDN最大的优势在于,关于来自世界各地的用户,它能够就近分配CDN节点获取数据,而且屡次重复获取同一个文件数据的时分,有缓存加快的作用。假如你的服务和目标存储都在内网,而且文件数据也不太会有重复运用的或许性,那其实没必要接入cdn。

最后

最近原创更文的阅读量稳步跌落,思前想后,夜里辗转反侧。

我有个不成熟的恳求。

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

离开广东好长时间了,好久没人叫我靓仔了。

我们能够在谈论区里,叫我一靓仔吗?

我这么仁慈质朴的愿望,能被满意吗?


别说了,一同在知识的海洋里呛水吧