【问题标题】:Dealing with failures or slowness of loading resources from CDN.处理从 CDN 加载资源的失败或缓慢。
【发布时间】:2012-07-05 17:48:20
【问题描述】:

我正在为网站上的 js、css 和图像使用 CDN (maxcdn.com)。我注意到,从一些 ISP 那里,这些资源要么完全无法加载,要么加载速度非常慢。但是,来自我的服务器的本地静态服务总是可以正常工作。因此,我希望能够检测到此类资源加载失败并通过回退到本地服务来响应它们。

我在这里找到了几种检测 js 和 css 加载失败的解决方案。最常见的是使用嵌入式 js 从 css 中检查一些 js var 和一些 cssRules(位于脚本和链接标签之前、之后)。但是,这不允许:

  1. 检测加载缓慢(检测到加载缓慢后应立即开始回退……)
  2. 检测从 css 引用的图像的加载失败。

是否有任何简单、优雅的方法来检测资源加载失败/缓慢并快速回退到本地服务?

【问题讨论】:

  • @Andreas 我确实搜索了类似的问题,但没有找到适合的解决方案:他们无法检测到 slow 加载资源,只有完全失败(可能发生经过长时间的等待)
  • 而this topic 也无济于事?
  • @raina77ow 这可能对 js 和 css 文件有帮助,但对图像没有帮助。不过还是谢谢你!
  • CDN 本来应该更快,但人们都弄错了,CDN 服务器终于成为共享主机的噩梦,而且超卖。在本地提供内容总是更好,因为在今天的网络中,几毫秒的差异对用户何时加载并缓存资源没有影响。在这两种情况下,CDN 使您的服务器停机,CDN 使您的服务器停机,您的用户无法使网站运行。 CDN 应该用于视频和更大的资源,而不是 JavaScript 和图像。

标签: javascript cdn fallback


【解决方案1】:

如https://stackoverflow.com/a/2021325/745190 此处所述,在开始加载脚本后无法禁用它。

您可以尝试最初从 cdn 加载一个非常小的 (.1kb) 脚本。在很短的时间后测试该脚本,如果它下载使用 javascript 将其他脚本标签附加到您的页面,如果没有,它是一个不必要的小文件下载。

遗憾的是,这种方法有两个主要缺点。第一个是对 cdn 的额外查询,第二个是无法完全加载小脚本可能会导致您的浏览器滚轮一直旋转。

如果你不确定,测试是这样的:

/* tiny-file.js */
var window.speedTest = true;

和

/* The test */
setTimeout(function(){
    if (window.speedTest !== true) {
        //append local javascript
    }
    else {
        //append cdn javascript
    }
}, 50);

【讨论】:

  • 这如何回答关于检测失败的图像加载的问题?
  • 我假设问题在于与 CDN 的连接,而不是任何单个内容的下载速度。您需要检查相对速度是多少,您可以像脚本标签一样轻松地使用 javascript 附加图像。
  • 没有办法检查它是慢还是失败。这是一个很好的解决方案,虽然我会给它超过 50 毫秒!
  • 如果我将这个小脚本添加为“异步”会怎样? (对于支持此功能的浏览器)它是否会阻止浏览器被锁定,直到请求完全失败或脚本被加载?
  • 你可以试试。您可能不希望在图像准备好之前加载页面,或者如果您使用此方法附加样式表,则在您的页面可以设置样式之前。根据您期望页面上的负载,您可以对此做出判断。如果您希望大量点击允许 CDN 加载更长时间,如果您希望页面单独快速加载,请选择较低的值,但希望直接从您的服务器提供更多内容。
【解决方案2】:

我怀疑您的问题主要发生在某些 ISP 上。

如果您的主要目标是在保持 CDN 作为主要解决方案的同时实现性能,我可以看到两个选项。首先,您尝试识别失败的 ISP,但这可能会非常耗时且成本高昂。 另一种选择是“学习”。尝试从 CDN 加载一个简单的 JS 设置变量。如果失败,您可以假设存在问题。设置一个 cookie 并在下一页加载时使用它来自动从您的主服务器加载所有内容。

【讨论】:

  • 你会如何处理大部分图片加载失败而 js var 测试似乎成功通过的情况?
  • 我会做相反的事情:在加载一组已知图像之前设置一个变量,然后在“加载”事件中减少它。然后可以使用超时来读取变量并决定要做什么。
  • @jtlebi 以及如何将加载事件附加到从 css 引用的图像(作为某些元素的背景)?
  • 不知道如何附加一个加载事件。但是您可以依赖于每个页面加载仅加载一次图像这一事实。在远处但“可见”的 div 中引用 HTML 中的相同图像并将事件附加到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 2020-07-27
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2019-10-26
  • 2022-06-16
相关资源
最近更新 更多