关于 cdn、回源等问题一网打尽

30,982 阅读5分钟

复盘日常问题板的时候,看到了曾经听到后端同学讨论的回源的问题。一直以来对 cdn 相关的知识一知半解,借此机会彻底梳理一下。

文章目录:

  • 访问 cdn 资源和不通过 cdn 访问的过程有什么不同
  • 回源是什么意思?
  • 除了静态资源,API 是否可以缓存?
  • 资源的过期如何判定?cdn 是如何更新数据的?
  • 几个专业术语

访问 cdn 资源和不通过 cdn 访问的过程有什么不同

一般的过程我们都知道了,不再赘述。下面我们来看看访问 cdn 的过程。

cdn 访问过程(盗图)
1.首先访问本地的 DNS ,如果没有命中,继续递归或者迭代查找,直到命中拿到对应的 IP 地址。 2.拿到对应的 IP 地址之后服务器端发送请求到目的地址。注意这里返回的不直接是 cdn 服务器的 IP 地址,而是全局负载均衡系统的 IP 地址 4.全局负载均衡系统会根据客户端的 IP地址和请求的 url 和相应的区域负载均衡系统通信 5.区域负载均衡系统拿着这两个东西获取距离客户端最近且有相应资源的cdn 缓存服务器的地址,返回给全局负载均衡系统 6.全局负载均衡系统返回确定的 cdn 缓存服务器的地址给客户端。 7.客户端请求缓存服务器上的文件

简单来说,其实 cdn 就是个放服务端资源的一个仓库。康师傅的泡面如果不是有家门口的小卖部,我们就得去人家的工厂门口拿。有了小卖部,我们只需要去一个卖康师傅&&有货的小卖部拿,就是这个道理。

其中有一个比较重要的点,在过程1里:这个过程中,有一个 CNAME 的过程,我们访问 cdn 资源的地址一般是 a.cloud.com 或者类似的地址,是一个公司的访问 cdn 的专用地址。但是我们用的 cdn 的服务却是第三方的,即其实资源在他们的地址上比如 tencent.cdn。这时候就需要在 dns 查询的时候,需要把我们访问 a.cloud.com的地址映射到 tencent.cdn 的地址上,然后拿着映射后的地址再去走一遍 dns 解析,成功之后才获取到第三方提供的全局负载均衡系统的 IP。再继续走后面的流程。

回源是什么意思?

当 cdn 缓存服务器中没有符合客户端要求的资源的时候,缓存服务器会请求上一级缓存服务器,以此类推,直到获取到。最后如果还是没有,就会回到我们自己的服务器去获取资源。 那都有哪些时候会回源呢?没有资源,资源过期,访问的资源是不缓存资源等都会导致回源。其他情况欢迎小伙伴们在评论区补充~

除了静态资源,API 是否可以缓存?

注意题目所描述的情况不是 cdn 的动态加速。

动态加速的对象是动态生成的网页,动态加速一般是对针对内容(如数据库信息等)在用户与- 源站之间建立高速通道,通过路由优化、TCP加速等技术手段对动态内容进行加速,降低节点到源站之间的时延,从而大大降低了用户访问动态网页的延迟。

其实这个问题我没有找到比较合适的解答,下面我想说一下我个人的见解。 我们使用 cdn 的原因是,我们经常有一些比较频繁请求且容量比较大的文件,并且更新频率不那么高的文件。这些文件如果我们都放在自己的服务器上,于客户端问题在于访问时间长,于服务器端是占用服务器端的资源。所以我们采用分布式的方式扔在 cdn 上。但是 API 不同,首先他常更新,其次他多和用户信息等相关联,并且 cdn 判断是否缓存是依靠 url,意味着他只能缓存 get 请求,所以他的应用范围是有限的。并且 api 常更新,推送更新到所有 cdn 节点同样是需要耗费资源的。所以 API 是不适合放在 cdn 上的。但是如果你的内容是相对静态的,不涉及和用户信息关联,并且能在一段时间内容忍缓存,更新不频繁,那么也不是不能考虑。

资源的过期如何判定?cdn 是如何更新数据的?

资源过期时间就是根据我们老生常谈的请求头部来判定。这个后面会单拎出一篇文章带大家复习一下。 那么 cdn 是如何更新数据的?分两种,主动(PUSH)和被动(PULL)。被动刚才我们已经提到过了,利用回源就可以被动在途经的 cdn 节点缓存数据。 而主动指的是,我们从服务器主动往 cdn 推送数据。

几个专业术语

边缘节点:指距离最终用户接入具有较少的中间环节的网络节点

参考文献: CDN 学习中的一点小思考 CDN 命中率、回源率常见问题 CDN缓存那些事 让 API 也上 CDN 吧 CDN的基本工作过程 CDN是什么?使用CDN有什么优势? cname记录是什么?他存在的意义是什么? CDN工作原理(CNAME) 【CDN 最佳实践】CDN缓存策略解读和配置策略 CDN缓存那些事儿