在过去的两个月里,我遇到了Amazon Cloudfront间歇性故障(每周2-3次),从而我的网络服务器会加载该页面,但CDN的所有资产都会在当时等待几分钟(我确认,从不同数据中心的外壳卷曲,一些工作有些不依赖于边缘位置 - 伦敦?)。待处理的请求成功后,一切都恢复正常。 我们一直在向亚马逊报告此事,但他们总是回答:“不要指望我们回复。如果有数十亿人只会抱怨,那么我们会考虑调查这种”消息。在我写完支持请求之前,它通常会恢复正常运行。
我得出的结论是,由于缺少迁移到其他CDN的开发时间,最好的方法是在html标题中添加一个脚本,只要发生类似的事情就会告诉我们。所以在标题中说如果请求花费的时间超过N毫秒,则尝试从CDN下载一个小的gif,然后在根域中调用任意URL(用于监视)。
问题: 在所有流行的浏览器中,如何可靠地在超时时请求具有回调的文件。即:
怎么回事?
感谢。
答案 0 :(得分:1)
这已经在IE.7& 8中进行了简要测试,在Windows和Windows上最新的FF。 OSX以及Chrome。我建议你自己测试一下。缩小!如果您知道更好的方法,请提出改进建议。使用ie脚本代替图像的方式已被考虑和决定,可能主要是由于我的无知。
下一个版本将在超时时写入cookie,未来的请求将在服务器端处理(使用相对资产路径)。饼干将在30分钟后过期。每连续超时都会续订该cookie。不知道我将如何处理第一次故障转移。可以是重定向(不是很优雅但很简单)。也许我会想出更聪明的方法(可能更优雅,但也更复杂)。
<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>
这也是我将用于服务器端cdnMonitor.php的临时监控:
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');
您需要将“HTTP_X_REAL_IP”更改为REMOTE_ADDR或任何适合您需要的内容。我使用反向代理,这就是我的工作。
最后我在帖子编辑器中做了最后一分钟的修改,可能已经破坏了一些东西。手指交叉。