【问题标题】:Is it better to use Cache or CDN?使用缓存还是使用CDN更好?
【发布时间】:2012-10-06 15:43:21
【问题描述】:

我正在研究加载静态文件时的浏览器性能,这个疑问出现了。

有人说使用CDN静态文件(即Google Code、jQuery 最新的,AJAX CDN,...) 性能更好,因为它请求 来自另一个域而不是整个网页。

其他提高性能的方法是设置Expires header 等于几个月后,强制浏览器缓存静态 文件并减少请求。

我想知道哪种方式最好,考虑性能和 如果我可以将两者结合起来。

【问题讨论】:

标签: performance cdn browser-cache


【解决方案1】:

CDN 的优势在于提供多个服务器并自动将您的流量路由到离您的客户端最近的位置。这可以加快交付速度,并根据位置进行优化。

此外,静态内容不需要特殊的应用服务器(如动态内容),因此能够将其卸载到 CDN 意味着您可以完全减少流量。流式视频剪辑可能太大而无法缓存或不应缓存。但是您不一定要支持该带宽。 CDN 将为您承担该流量。

这并不总是与缓存有关。小型应用程序 Web 服务器可能只想提供动态内容,但需要针对很少更改的重磅媒体的解决方案。 CDN 为您处理扩展问题。

【讨论】:

    【解决方案2】:

    对于公共应用程序,请选择 CDN。 缓存有助于重复请求,但不适用于第一个请求。 为了确保在第一页访问时快速加载使用 CDN,文件很可能已经被另一个站点缓存了。 正如其他人已经提到的那样,CDN 结果当然也被大量缓存了。

    但是,如果您有一个 Intranet 网站,您可能希望自己托管这些文件,因为它们通常从内部源加载比从 CDN 加载更快。 然后,您还可以选择将多个文件合并为一个以减少请求数量。

    【讨论】:

    • 也非常感谢您的回答!作为最佳答案,它并不完整,但是,它们一起帮助了我太多!
    【解决方案3】:

    如果您正在对网站进行 Web 性能优化 (WPO),也称为前端优化 (FEO),最终最好同时使用这两种技术。他们可以惊人地携手合作。虽然如果我不得不选择一个而不是另一个,我肯定会选择缓存任何一天。事实上,我想说的是,即使您要使用 CDN,也必须为所有 Web 项目设置适当的资源缓存。

    缓存

    设置Expires 标头和资源缓存是必须的,并且应该在 100% 的时间内为您的资源完成。真的没有理由不做缓存。在 Apache 上,启用 mod_expires.cmod_headers.c 后,这非常容易配置。 HTML5 Boilerplate project.htaccess file 中有很好的实现示例,如果您的服务器是 nginx、lighttpd 或 IIS 之类的其他东西,请查看这些 other server configs

    如果有人有兴趣了解缓存,请阅读以下内容:Mark Nottingham's Caching Tutorial

    内容交付网络

    您提到了Google Code, jQuery latest, AJAX CDN,我只想简单谈谈 CDN,包括那些您付费并托管自己的资源的 CDN,但如果您只是使用 jquery 托管文件 cdn 或从 http://cdnjs.com/ 加载内容,这同样适用例如。

    我想说 CDN 不如设置服务器端标头缓存重要,但 CDN 可以提供显着的性能提升,但您的内容交付网络性能会有所不同depending on the provider

    如果您的流量是全球受众并且 CDN 提供商在全球范围内拥有许多边缘/对等位置,则尤其如此。它还会显着减少您的虚拟主机带宽和 CPU 使用率(一点),因为您将一些工作卸载到 CDN 以交付资源。

    在极少数情况下,如果 CDN 的延迟最终比您的服务器慢,那么 CDN 可能会对性能产生负面影响。此外,如果您过度优化并使用过多的parallelization 资源(使用多个子域,如 cdn1、cdn2、cdn3 等),最终可能会降低用户体验并导致额外的 DNS 查找开销。这里需要一个很好的平衡。

    另一个可能发生的负面影响是 CDN 出现故障。它已经发生了,而且还会再次发生。免费 CDN 更是如此。如果 CDN 由于某种原因出现故障,您的网站也会出现故障。这是另一个潜在的single point of failure (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>
    

    除了明显的免费 API 资源(jquery、google api 等)之外,如果您使用 CDN,您可能需要支付使用费,这样会增加托管成本。当然,对于某些 CDN,您甚至必须支付额外费用才能访问某些位置,例如亚洲节点可能比北美节点成本更高。

    【讨论】:

    • 这不仅仅是一个答案,它是一个真正的教训!非常感谢。
    • 你有没有测试过样板文件使用的回退的性能?我一直很想说,但我的猜测是等待加载原件的超时太糟糕了,在我们执行 document.write 之前网站看起来已经坏了
    • @AndyDavies 我已经测试过了,你可以看到 Steve 所做的测试。最后可能的结果很简单:(1)资源上的 404 甚至不会被用户注意到。 (2) 资源超时 + 失败,这将导致等待时间等于浏览器(和用户)等待的时间。在这两种情况下,如果用户决定在没有点击刷新的情况下闲逛,您可以确定站点损坏。如果您必须等待更长的时间,那还不错。无论如何,jQuery 应该位于底部,因此至少页面和 css 渲染得稍微多一些,而不是空白。
    • 如果你想自己测试 SPOF 你可以试试这个blog.patrickmeenan.com/2011/10/testing-for-frontend-spof.html
    • SPOF 更新: 您可以在 webpagetest.org > 高级设置 > SPOF 选项卡上实际测试 SPOF
    【解决方案4】:

    同意@Anthony_Hatzopoulos (+1)

    CDN 补充了缓存;在某些情况下,它还有助于优化缓存指令。

    例如,我工作的一家公司已将行为学习算法集成到其 CDN 中,以识别和动态缓存生成的对象。

    通常,这些对象是不可缓存的(即 [Cache-Control: max-age=0] Http 标头)。但在这种情况下,系统能够识别缓存的可能性并覆盖原始 HTTP 标头方向。 (例如:动态生成的流行产品应该被缓存,或者流行的搜索结果页面虽然是动态生成的,但随着时间的推移仍以相同的形式呈现给成千上万的用户)。

    是的,在你问之前,系统还可以识别个性化的数据并且非常新鲜,防止误报... :)

    只有通过反向代理 CDN 技术才能实现这样的算法。这是 CDN 和缓存如何相互补充以创建更好、更智能的加速解决方案的示例。

    【讨论】:

      【解决方案5】:

      在那些专家的引用之上,解释是完美的理解 CDN 技术和缓存 我只是提供我的个人经验,我曾在 joomla 德行网站上工作,不幸的是它不允许更新新的 joomla 和德行版本,因为产品页面中的自定义字段太多,所以一旦访问者达到 900/天和很多用户无法将他们的物品放入他们的购物篮,因为每次调用很多 js 和 ajax 调用订单物品都需要太多时间

      网站优化后,我们决定使用CDN,然后性能真的变好了,根据gtmetrix的记录,第一次YSlow Score是50%,然后优化+CDN之后是74%

      https://gtmetrix.com/reports/www.florihana.com/jWlY35im

      从 CDN 的仪表板中,您可以看到哪个数据中心的成本最高和收费最高的数据,以提高您的营销水平:

      但是要配置 CDN,它必须注意清除时间并平衡资源 CDN 的数量,如果它关闭了一些问题,您需要找出哪个资源 CDN 原因

      希望这会有所帮助

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-19
        • 2011-08-26
        • 2011-03-24
        相关资源
        最近更新 更多