【问题标题】:Intermittent Cloudfront CDN failures (monitoring) - CDN Failover间歇性 Cloudfront CDN 故障(监控) - CDN 故障转移
【发布时间】:2011-10-27 04:11:21
【问题描述】:

在过去的 2 个月中,我一直在经历 Amazon Cloudfront 间歇性故障(每周 2-3 次),该页面将从我的 Web 服务器加载,但 CDN 中的所有资产当时会阻塞等待几分钟(我确认,使用来自不同数据中心的 shell curl,有些工作不依赖于边缘位置 - 伦敦?)。一旦挂起的请求成功,一切都会恢复正常。 我们一直在向亚马逊报告这个问题,但他们总是回复“不要指望我们的回复。如果有无数人会抱怨,那么我们会考虑调查这种信息”。通常在我写完支持请求之前它会恢复正常运行。

我得出的结论是,由于缺乏迁移到其他 CDN 的开发时间,最好的方法是在 html 标头中添加一个脚本,以便在发生类似情况时通知我们。因此,如果请求花费的时间超过 N 毫秒,请在标头中尝试从 CDN 下载一个小 gif,然后调用根域中的任意 url(用于监控)。

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

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

还有什么办法?

谢谢。

【问题讨论】:

  • 显然以后可能/将演变为完整的回退机制,但我们希望快速评估问题的规模。稍后我们需要在 CDN 超时(或状态> = 400)时更改我们的 JS 和 CSS 路径 - 由于相对路径,图像会跟随...希望 :)

标签: javascript ajax cdn failover amazon-cloudfront


【解决方案1】:

这已在 IE.7 和 8、Windows 和 OSX 以及 Chrome 上的最新 FF 中进行了简要测试。我建议你自己测试一下。缩小!如果您知道更好的方法,请提出您的改进建议。使用即脚本而不是图像的方式已被考虑并决定反对可能主要是由于我的无知。

下一个版本将在超时时写入 cookie,未来的请求将在服务器端处理(使用相对资产路径)。 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 或任何适合您需要的内容。我使用反向代理,所以我就是这样做的。

最后,我在帖子编辑器中做了一些最后的更改,可能会损坏一些东西。手指交叉。

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多