Периодические сбои CDN Cloudfront (мониторинг) - отказоустойчивость CDN - PullRequest
3 голосов
/ 15 августа 2011

В течение последних 2 месяцев у меня возникали периодические сбои в Amazon Cloudfront (2-3 раза в неделю), из-за которых страница загружалась с моего веб-сервера, но все ресурсы из CDN блокировались в течение нескольких минут в ожидании (Я подтвердил, что при работе с оболочкой из разных центров обработки данных некоторые работы не выполняются, в зависимости от местоположения края - Лондон?).Как только ожидающие запросы успешны, все возвращается в нормальное состояние.Мы сообщали об этом Амазонке, но они всегда отвечали: «Не ожидайте от нас ответа. Если газлионы будут жаловаться только тогда, мы рассмотрим это».Часто он возобновляет нормальную работу до того, как я закончу писать запрос в службу поддержки.

Я пришел к выводу, что лучший способ продолжить из-за нехватки времени на разработку для перехода на другой CDN - это добавить скрипт вЗаголовок HTML, который будет сообщать нам всякий раз, когда происходит что-то подобное.Так, скажем, в заголовке попробуйте загрузить крошечный gif из CDN, если запрос занимает больше времени, чем N msec, а затем вызвать произвольный URL-адрес в корневом домене (для мониторинга).

Вопрос: Как надежно, во всех популярных браузерах, запрашивать файл с обратным вызовом по таймауту.т.е.:

  • файл запроса из CDN с использованием AJAX - не будет работать из-за междоменных ограничений?
  • setTimeout ("callbackTimeout", 2000) callbackTimeout () {getElementById () else... HttpWebRequest ...} - будет ли это заблокировано ожидающим запросом HttpWebRequest или он будет работать?

Как еще?

Спасибо.

1 Ответ

1 голос
/ 16 августа 2011

Это было кратко протестировано в IE.7 & 8, обновленном FF для Windows & OSX, а также в Chrome. Я предлагаю вам проверить это самостоятельно. Минимизировать! Если вы знаете лучший способ сделать это, пожалуйста, предложите свои улучшения. Способ использования сценария вместо изображения был рассмотрен и решен, вероятно, в основном из-за моего невежества.

Следующая версия запишет 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 или что-то еще, соответствующее вашим потребностям. Я использую обратный прокси, вот что я делаю.

Наконец, я внес некоторые последние изменения в редактор сообщений и, возможно, что-то сломал. Скрестив пальцы.

...