CDN 的神话






4.81/5 (7投票s)
为 JS 框架使用 CDN 真的值得吗?
引言
我最近在 HeadJS 的 Github 页面上收到一个问题,有人问是否可以从 CDN 链接 HeadJS 并设置本地回退。
我的第一反应是,当然可以,这和 jQuery 一样,毕竟使用 CDN 之类的都是好事,对吧?至少这几年大家都在这么宣传。
然后,大约 10 分钟后,当这些信息终于沉淀下来,我开始回想过去使用不同库和 CDN 的各种经历,我开始质疑我的回答……
我现在对这个问题的答案是:使用 CDN 来托管 JS 框架真的值得吗?
也许,但很可能不值得!
重要提示:如果您将网站的静态内容托管在 CDN 上,那么您无需担心。此解释仅适用于链接到各种 CDN 上的 JS 库,例如 jQuery,我将以此为例。
CDN 的理念是,网站 **A** 引用了它上面的一个库,然后如果您访问网站 **B**,而网站 **B** 也引用了它,那么用户就会命中缓存,他将不必再次下载该资源。您节省了带宽,用户体验也会更快。皆大欢喜!
对吧?也许吧。
所以,正如其理念所阐述的,当尽可能多的网站链接到同一个资源,并且用户在从网站 A 到 B 再到 C 等等之间切换时,能够命中这些相同的资源,CDN 就很有用。
如果我们查看 W3techs,他们说 jQuery 的市场份额为 56.7%,其次是 Mootools,市场份额为 5.1%。
如果我们查看 BuiltWith,我们会得到类似的结果,但会细分到流行的网站范围。
来自 BuiltWith 的另一张图表显示了这个布局。
那么,这告诉我们什么?
- 用户会遇到 2 个网站中有 1 个使用 jQuery(这非常好!)。
- 直接忽略其他库!
好吧,但我们应该使用哪个 CDN……如果使用的话?
* jQuery 的 CDN 现在支持 HTTPS 了。
从上面的图表来看,我们可以假设官方的 jQuery CDN 是最合适的。我还会在这里加分,因为它是 jQuery 网站上的默认链接,这增加了它的覆盖范围。
话虽如此,许多人也是 Google CDN 的粉丝,还有一些是 Microsoft 的……这没问题,但。
如上所述,jQuery 几乎被一半的网站使用,但使用的是哪个版本,是托管在 CDN 上还是本地,如果是 CDN,又是哪个 CDN……
让我们来算算账。
以下的计算是完全理论化的,没有实际的世界测量……但应该能说明一点问题。
在 100% 的网络中。
50% 使用 jQuery。
假设其中 50% 的人中,有 25% 实际上使用了 CDN。
这样,就有 12.5% 的所有网站使用 jQuery 和 CDN。
……现在有多少个不同版本的 jQuery?
查看 Google CDN,我们看到了上图。如果我们只计算 1.x 系列,有 30 个版本。哎哟!
您知道有多少网站actually 使用最新、最好的版本并且始终保持代码更新吗?……我很少知道 :-(
所以,我们假设大多数网站使用的是 10 个潜在版本中的 1 个,而不是全部 30 个。
我们的 12.5% 现在只剩下 1.2% 了……
差点忘了,有很多 CDN,虽然最受欢迎的可能是:jQuery CDN(至少对于 jQuery 而言),Google,Microsoft。
既然我们还在谈论 jQuery,我们就说 jQuery 的 CDN 占有 70% 的市场份额,其余的平均分配。这现在给了 0.84%,以及 0.12%。
所以……通过 CDN 使用 jQuery,取决于您使用哪个 CDN,您有 119 分之一或 833 分之一的机会用户拥有缓存副本。
还有一些其他要点需要考虑。
如果 CDN 宕机或响应缓慢,它将导致您的整个网站在超时期间卡顿(回退脚本至少需要 15 秒才能启动……您正在使用一个,对吧?)。
当然,大多数 CDN 都声称有 99.9% 的正常运行时间 SLA,但就我个人而言,我曾亲身经历过 jQuery、Google 或 Microsoft 的 CDN 并不总是那么好。
如果您主要为离您数据中心近(半径 1000 公里内)的用户提供服务,那么通过您自己的数据中心访问的速度可能比通过 CDN 略快。
更新:我收到了一些关于用户浏览行为和缓存的反馈……在一个完美的世界里,这会如预期般运作,但在现实中,统计数据如下:
- 约 30% 的用户拥有完整的缓存(上限为 320 MB)。
- 对于拥有完整缓存的用户,填满缓存的中位数时间为 4 小时的活跃浏览(20 小时的时钟时间)。
- 7% 的用户每周至少清除一次缓存。
- 19% 的用户每周至少经历一次“致命缓存损坏”,因此清除缓存。
来源:Cache them if you can: S. Souders
结论
- 如果您想从 CDN 链接到某个 JS 框架……如果是 jQuery,当然可以。
- 您不会获得太多收益,但也不会损失太多。
- 如果不是 jQuery……您就是在浪费时间。
- 不要为了简单的缓存目的而使用 CDN。
但是,如果您有许多国际用户,那么 CDN 可能会更快(这与缓存无关,而是将您的内容拉近到您的受众!)。在这种情况下,您也应该开始考虑(如果您还没有考虑过的话)将所有静态内容(js、css、字体、图片)移到真正的 CDN,以加快您的网站速度。