我在学习关于浏览器加载静态文件时的性能,有一个疑问。
一些人说使用CDN静态文件(例如Google Code、jQuery最新版本、AJAX CDN等)对性能更好,因为它请求来自整个网页不同的另一个域。
另一种提高性能的方法是将
Expires
头设置为几个月后,强制浏览器缓存静态文件并减少请求。我想知道哪种方法是最好的,考虑性能以及是否可以同时使用两种方法。
我在学习关于浏览器加载静态文件时的性能,有一个疑问。
一些人说使用CDN静态文件(例如Google Code、jQuery最新版本、AJAX CDN等)对性能更好,因为它请求来自整个网页不同的另一个域。
另一种提高性能的方法是将
Expires
头设置为几个月后,强制浏览器缓存静态文件并减少请求。我想知道哪种方法是最好的,考虑性能以及是否可以同时使用两种方法。
您提到了Google Code、jQuery latest、AJAX CDN
,我想简单谈谈CDN的一般情况,包括您付费使用的和托管您自己资源的CDN,但如果您只是使用托管文件的jquery cdn或从http://cdnjs.com/加载某些内容,同样适用。
我认为CDN不如设置服务器端头缓存重要,但CDN可以提供显著的性能提升,但是您的内容交付网络性能取决于服务提供商。
特别是对于全球受众并且CDN提供商拥有许多全球边缘/对等位置的情况尤其如此。它还将显着降低您的Web托管带宽和CPU使用率(略微),因为您正在将部分工作转移到CDN来交付资源。
CDN在某些情况下可能会对性能产生负面影响,如果CDN的延迟比您的服务器还要慢,则会出现这种情况。此外,如果您过度优化并使用太多并行化资源(例如使用多个子域名,如cdn1、cdn2、cdn3等),可能会导致用户体验变慢,并造成额外的DNS查找开销。需要在此处保持良好的平衡。
另一个可能发生的负面影响是CDN宕机。这已经发生过,也将再次发生。这对于免费CDN来说更为真实。如果CDN因任何原因而宕机,则您的网站也会宕机。这是另一个潜在的单点故障(SPOF)。对于JavaScript资源,您可以聪明地从CDN加载资源,并在失败时检测并加载本地副本。以下是从ajax.googleapis.com加载jQuery并具有备用方案的示例(取自HTML5 Boilerplate):
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.2.min.js"><\/script>')</script>
对于公共应用程序,选择CDN。
缓存有助于重复请求,但不适用于第一次请求。
为确保在首次访问页面时快速加载,请使用CDN,很有可能该文件已由另一个站点缓存。
正如其他人已经提到的那样,CDN的结果当然也是被大量缓存的。
然而,如果您有一个内部网站,可能希望自己托管文件,因为它们通常从内部源加载比从CDN加载更快。
这样,您还可以将多个文件合并为一个文件以减少请求数。
同意@Anthony_Hatzopoulos (+1)
CDN是缓存的补充,有时它也可以帮助优化缓存指令。
例如,我所在公司已经将行为学习算法集成到其CDN中,以识别并动态缓存生成的对象。
通常,这些对象是不可缓存的(即[Cache-Control:max-age = 0] Http头)。但在这种情况下,系统能够识别缓存可能性并覆盖原始HTTP标头方向。(例如:应该被缓存的动态生成的热门产品,或者是热门搜索结果页面,虽然是动态生成的,但仍以相同的形式呈现给数千个用户)。
是的,在你问之前,系统也可以识别个性化数据和非常新鲜的内容,以防止误报... :)
实施这样的算法只有通过反向代理CDN技术才有可能。这是CDN和缓存如何相互补充,创建更好、更智能的加速解决方案的一个例子。
https://gtmetrix.com/reports/www.florihana.com/jWlY35im
从CDN的仪表板上,您可以看到哪个数据中心成本最高,哪些数据收费最高,以便提高您的营销效果:
是的,配置CDN时必须注意清除时间和平衡资源CDN的数量,因为如果出现问题,您需要找出哪个资源CDN导致了问题。
希望这可以帮助到您。