3

過去2か月間、Amazon Cloudfrontの断続的な障害(週に2〜3回)が発生しました。これにより、ページはWebサーバーから読み込まれますが、CDNのすべてのアセットはその時点で数分間保留中にブロックされます(確認しましたさまざまなデータセンターからのシェルカールを使用すると、エッジの場所に依存しないものもあります-ロンドン?)。保留中のリクエストが成功すると、すべてが通常に戻ります。私たちはこれをアマゾンに報告していますが、彼らはいつも「私たちからの返事を期待しないでください。何億人もの人々が不平を言うなら、私たちはこの種のメッセージを調べることを検討します」と答えます。多くの場合、サポートリクエストの作成が完了する前に、通常の操作を再開します。

他のCDNに移行するための開発時間が不足しているために続行する最善の方法は、同様のことが発生したときに通知するスクリプトをhtmlヘッダーに追加することであるという結論に達しました。したがって、ヘッダーで、リクエストにNミリ秒より長い時間がかかる場合は、CDNから小さなgifをダウンロードしてみてから、ルートドメイン内の任意のURLを呼び出します(監視用)。

質問: 一般的なすべてのブラウザで、タイムアウト時にコールバックを使用してファイルを確実に要求するにはどうすればよいですか。すなわち:

  • AJAXを使用したCDNからのリクエストファイル-クロスドメインの制限のために機能しませんか?
  • setTimeout( "callbackTimeout"、2000)callbackTimeout(){getElementById()else ... HttpWebRequest ...}-保留中のHttpWebRequest要求によってブロックされますか、それとも機能しますか?

他には?

ありがとう。

4

1 に答える 1

1

これは、IE.7&8で簡単にテストされており、WindowsとOSX、およびChromeで最新のFFが使用されています。自分でテストすることをお勧めします。縮小!これを行うためのより良い方法を知っている場合は、改善を提案してください。画像の代わりにieスクリプトを使用する方法が検討され、おそらく私の無知のために反対されました。

次のバージョンはタイムアウト時に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またはニーズに合ったものに変更する必要があります。私はリバースプロキシを使用しているので、それを実行します。

最後に、投稿エディタで土壇場で変更を加えましたが、何かが壊れている可能性があります。成功を祈っている。

于 2011-08-16T12:39:07.837 に答える