Javascript 间歇性Cloudfront CDN故障(监视)-CDN故障切换

Javascript 间歇性Cloudfront CDN故障(监视)-CDN故障切换,javascript,ajax,cdn,failover,amazon-cloudfront,Javascript,Ajax,Cdn,Failover,Amazon Cloudfront,在过去的两个月里,我一直在经历Amazon Cloudfront间歇性故障(每周2-3次),页面将从我的web服务器加载,但CDN中的所有资产将在等待数分钟后被阻塞(我确认,使用来自不同数据中心的shell curl,有些可以工作,有些则不取决于边缘位置-伦敦?)。一旦挂起的请求成功,所有请求都会恢复正常。 我们已经向亚马逊报告了这一点,但他们总是回答:“不要期待我们的回复。如果GASLLION的人会抱怨,那么我们会考虑查看这类消息。在写支持请求之前,它通常恢复正常操作。 我得出的结论是,由于缺

在过去的两个月里,我一直在经历Amazon Cloudfront间歇性故障(每周2-3次),页面将从我的web服务器加载,但CDN中的所有资产将在等待数分钟后被阻塞(我确认,使用来自不同数据中心的shell curl,有些可以工作,有些则不取决于边缘位置-伦敦?)。一旦挂起的请求成功,所有请求都会恢复正常。 我们已经向亚马逊报告了这一点,但他们总是回答:“不要期待我们的回复。如果GASLLION的人会抱怨,那么我们会考虑查看这类消息。在写支持请求之前,它通常恢复正常操作。

我得出的结论是,由于缺乏迁移到其他CDN的开发时间,最好的方法是在html标题中添加一个脚本,每当发生类似情况时,该脚本都会让我们知道。因此,在标题中,如果请求时间超过N毫秒,请尝试从CDN下载一个小gif,然后在根域(用于监视)

问题: 如何在所有流行浏览器中可靠地请求超时回调的文件。例如:

  • 使用AJAX从CDN请求文件-由于跨域限制而无法工作
  • setTimeout(“callbackTimeout”,2000)callbackTimeout(){getElementById()else…HttpWebRequest…}-这会被挂起的HttpWebRequest请求阻止还是会起作用
不然呢


谢谢。

这已经在IE.7和8中进行了简要的测试,在Windows和OSX以及Chrome上都是最新的FF。我建议你自己测试一下。缩小!如果你知道更好的方法,请建议你改进。使用脚本而不是图像的方法已经被考虑过了,可能主要是因为我的无知

下一个版本将在超时时写入cookie,未来的请求将在服务器端处理(使用相对资产路径)。cookie将在30分钟后过期。每个连续超时都将续订该cookie。不确定如何处理第一次故障切换。可能是重定向(不是很优雅,但很简单).也许我会想出更聪明的方法(可能更优雅,但也更复杂)

您需要将“HTTP\u X\u REAL\u IP”更改为REMOTE\u ADDR或任何适合您需要的内容。我使用反向代理,所以我就是这么做的


最后,我在最后一刻对post editor进行了一些更改,可能弄坏了一些东西。祝你好运。

很明显,这可能/将在以后演变为一个完整的回退机制,但我们希望快速评估问题的规模。稍后,我们需要在CDN超时(或状态>=400)时更改JS和CSS路径-由于相对路径,图像将跟随…希望:)
<script type="text/javascript">
//<![CDATA[
// Absolute path to a picture on your CDN to be monitored
cdnImagePath        = "http://YOURCDNADDRESS.net/empty.gif";
//this is relative path (cross domain limitation) 
//will be followed by "timeout" or "other" as a reason i.e. /cdnMonitor.php?message=timeout
cdnMonitoringPath = "/cdnMonitor.php?message=";
// Recommended 3000 for 3 second(s) timeout
cdnTimeoutMilisec = 3000;
// Set to true to be notified after timeout (provides extra information)
cdnNotifyAfterTimeout = false;

// Handler methods
cdnOK = function(){
     if (!cdnTimer && cdnNotifyAfterTimeout) cdnNotify('success');
}

cdnFail = function(reason){
     if (reason != "timeout") {
          if (cdnTimer) clearTimeout(cdnTimer);
          message = "error"
     } else {
          message = reason;
     }
     cdnNotify(message);
}

cdnTimeout = function() {
     cdnTimer = false;
     if (cdnImage.complete == false) {
          cdnFail("timeout");
     }
}

cdnNotify = function(message) {
     if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", cdnMonitoringPath + message, true);
        xmlhttp.send();
     } else {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
     }
}

// Load test image and define event handlers
cdnTimer = setTimeout("cdnTimeout()", cdnTimeoutMilisec);
cdnImage = new Image(); 
cdnImage.onload  = cdnOK;
cdnImage.onerror = cdnFail;
cdnImage.src = cdnImagePath + "?" + Math.floor(Math.random()*1000000);
//]]>
</script>
error_log(date('Y-m-d H:i:s.') .next(explode('.',microtime(1))). ' - '. $_GET['message'] . ' - '. $_SERVER['HTTP_X_REAL_IP']. ' - ' . $_SERVER['HTTP_USER_AGENT'] ."\n", 3, '/tmp/cdnMonitor.log');