1

実稼働環境で問題が発生しました。他の誰かがこの問題に遭遇し、スマートな解決策を持っている可能性があります。

前提条件:

  • 2 つのフロント エンド サーバーの前にロード バランサーを使用します。
  • CSS/JS/画像などの静的アセットの配信には CDN を使用します。
  • SquishIt を使用してチェックサムで JS/CSS ファイルのフィンガープリントを作成し、キャッシュ バスティングを提供します。
  • アプリケーションの開始時にアセット パスの先頭に CDN パスを追加します。これも SquishIt 機能 (.WithOutputBaseHref) です。例:/ui/main_465987ecb75.cssのようにレンダリングされます//cdn.host.com/ui/main_465987ecb75.css

展開ルーチン:

  1. server1 をロード バランサーから外します。
  2. server1 にデプロイします。
  3. 温めます。
  4. サーバー 1 をロード バランサーに含めます。
  5. server2 をロード バランサーから外します (...そして手順 2 ~ 4 を繰り返します)

そして、ここで失敗します:

上記のステップ 4 と 5 の間で、両方のサーバーを短時間オンラインにします。この間、server1 は main_46eb48ac968.css を参照し、server2 は main_987eba4687.css を参照している可能性があります。これにより、次のシナリオで問題が発生します...

使用事例:

  1. ユーザーがサイトにアクセスし、新しく展開されたサーバー 1 に到達します。
  2. ブラウザーは、CDN から main_46eb48ac968.css を要求します。
  3. そのファイルはキャッシュにないため、CDN はロードバランサーからそのファイルを要求します。
  4. ロード バランサーは、CDN 要求を server2 に送信します。
  5. 新しいファイルはサーバー 1 にのみあるため、サーバー 2 は 404 ページが見つからないというエラーを返します。
  6. サイトががらくたのように見えます!

もちろん、簡単な修正は、デプロイ中に CDN なしで実行することですが、アプリケーションの起動時に CDN URL がパスの前に追加されるため、本番環境でアプリケーションを再起動する必要があります... :/

アイデア?

4

2 に答える 2

0

うーん、あなたの CDN はあなたのサイトをオリジンとして使用していますか?

この問題を確認することをお勧めします。これにより、生成されたパスにハッシュがフォルダーとして書き込まれます。その後、IIS 書き換えルールを使用して、途中で URL からそのフォルダーを削除できます。ファイルの爆発なしの「ファイル名のハッシュ」オプション。これを使用して、何かが確実に提供されるようにすることもできますが、このシナリオでは、CDN のキャッシュに古いバージョンのファイルが残ることになります (したがって、デプロイの完了後にすべてを無効にする必要があります)。

これは、次のリリース (0.9.3) で利用可能になります。

于 2013-06-13T14:09:40.563 に答える
0

@AlexCuseへの回答

はい、CDN はサイトをオリジンとして使用しています。

実際、hash-as-virtual-folder-solution を提案したのは私でした :) この問題を発見したマルチ フロント サーバー環境に展開するまで、このソリューションを使用していました。これは、CDNや複数のフロント エンド サーバーがない環境でファイルをキャッシュ無効化する優れた方法です。残念ながら、私たちは両方を持っています。

hash-as-virtual-folder ソリューションを使用すると、両方のサーバーがオンラインで、1 つのサーバーが古いコードを使用し、もう 1 つのサーバーが新しいコードを使用している短い時間のケースの 50% で、古いファイルが新しい URL で提供されます。実際に展開後に CDN をフラッシュすることはできますが、クライアントが ctrl+F5 を押すまで更新されないため、間違ったファイルを既にダウンロードしているクライアントには役に立ちません。そして、それを制御することはできません。くだらない。;)

したがって、これまでの決定では、ユーザーが最初の訪問者「間違った」サーバーにアクセスした場合、CSS/JS を使用せずに 1 分間程度で質の悪いサイトを取得する方が、間違ったファイルをキャッシュしてキャッシュしないよりも優れているということです。次回のデプロイまで更新されます。

また、コードにいくつかの変更を加えました。CDN URL を格納しているキーを http キャッシュに削除することで、サーバーが稼働している間、アプリ プールをリサイクルせずに CDN を無効にできるようになりました。CMS にログインし、変更を行い、保存し、公開してから元に戻す必要があるため、少し面倒ですが、可能です。

とにかくありがとう、それは素晴らしい図書館です!

于 2013-06-13T18:32:21.687 に答える