1
eason1874 2021-11-09 06:45:26 +08:00
就一次,CDN 就是反代,中间人。Client -> CDN nodes -> Server
如果没配置缓存,那客户端访问一次,CDN 就回源一次。服务器只是接收到一次 CDN 节点请求,客户端请求不会到达。 如果配置了缓存,那客户端第一次访问,CDN 回源一次,缓存了,客户端再次访问时,CDN 节点上的缓存有效就直接返回缓存结果,不会回源(没有请求到达服务器)。 但缓存配置只是建议,CDN 不会完全遵循,CDN 有自己的缓存策略。比如小文件你设置一个月那真的能缓存一个月,几十万次都没流量到服务器,而大文件,你设置一个月,可能几个小时没流量就给清理掉了,一天回源好几次。 |
2
selfcreditgiving OP @eason1874 了解了多谢。 我遇到一个问题,是我的一个 动态 api 被调用了两次,疑问是不是 客户端和 cdn 节点各访问了一次呢。 那应该不是这个原因了。
对了,不要介意我 cdn 还缓存动态 api 的内容,我在测试 cdn 的功能, 原先的代码也没有根据动静分离,分别用不同的域名 比如 静态资源: static.domain.com/img.jpg 动态接口:apidomain.com/api/v1/getData 都是用一样的相对路径 /img/img.jpg /getData |
3
eason1874 2021-11-09 07:37:00 +08:00
@selfcreditgiving CDN 控制台可以查询 IP 是不是 CDN 节点的,你把访问日志 IP 复制去查下就知道是不是 CDN 的请求了
另外在控制台也可以设置回源 header ,你添加一个特别的回源 header ,不要泄露,然后把它加入到日志格式,就可以从日志一眼看出来是不是 CDN 回源的请求了。你还可以拒绝没有这个 header 值的访问,那可以确保访问全部经过 CDN |
4
selfcreditgiving OP @eason1874 又想了想 CDN 本质上应该算一个 DNS 服务器,把我托管在 CDN 的域名,又重新分配给不同的 ip (根据地域不同分配地理位置最近的服务器 ip ),客户端(比如浏览器)拿到这个 ip 后去访问服务器。
这个服务器如果没有请求的内容(也就是没有命中),就会触发回源。 这里又有一个细节的问题想问了。 触发回源,cdn 服务器去回源地址取到数据后,假如我是北京的,要等 cdn 服务器把数据从主节点,一个个下发 直到下发到 北京那个节点的 cdn 服务器后, 我的请求(浏览器的)才能从北京那个节点收到返回结果嘛? 那样触发一次回源不是比正常的直连会慢很多了。 |
5
eason1874 2021-11-09 09:38:25 +08:00
@selfcreditgiving CDN 是反代服务,不是 DNS 服务。CDN 会提供一个 CNAME 域名,通过 DNS 把流量调度到 CDN 的不同节点,但这个不是 CDN 业务本身,只是流量调度方式之一。也有非 DNS 调度的,Anycast 方式。
如果客户端网络条件足够好,服务器也能负载得起流量,经 CDN 回源再返回是会比直连慢一点的,不过影响微乎其微,几十毫秒到一两百毫秒,大部分场景是感觉不明显的。 有一种 CDN 类型专门做了链路加速,优化反代速度,通常叫全站加速,会贵一些,适合要求毫秒级的客户。 |