実稼働環境で問題が発生しました。他の誰かがこの問題に遭遇し、スマートな解決策を持っている可能性があります。
前提条件:
- 2 つのフロント エンド サーバーの前にロード バランサーを使用します。
- CSS/JS/画像などの静的アセットの配信には CDN を使用します。
- SquishIt を使用してチェックサムで JS/CSS ファイルのフィンガープリントを作成し、キャッシュ バスティングを提供します。
- アプリケーションの開始時にアセット パスの先頭に CDN パスを追加します。これも SquishIt 機能 (.WithOutputBaseHref) です。例:
/ui/main_465987ecb75.css
のようにレンダリングされます//cdn.host.com/ui/main_465987ecb75.css
展開ルーチン:
- server1 をロード バランサーから外します。
- server1 にデプロイします。
- 温めます。
- サーバー 1 をロード バランサーに含めます。
- server2 をロード バランサーから外します (...そして手順 2 ~ 4 を繰り返します)
そして、ここで失敗します:
上記のステップ 4 と 5 の間で、両方のサーバーを短時間オンラインにします。この間、server1 は main_46eb48ac968.css を参照し、server2 は main_987eba4687.css を参照している可能性があります。これにより、次のシナリオで問題が発生します...
使用事例:
- ユーザーがサイトにアクセスし、新しく展開されたサーバー 1 に到達します。
- ブラウザーは、CDN から main_46eb48ac968.css を要求します。
- そのファイルはキャッシュにないため、CDN はロードバランサーからそのファイルを要求します。
- ロード バランサーは、CDN 要求を server2 に送信します。
- 新しいファイルはサーバー 1 にのみあるため、サーバー 2 は 404 ページが見つからないというエラーを返します。
- サイトががらくたのように見えます!
もちろん、簡単な修正は、デプロイ中に CDN なしで実行することですが、アプリケーションの起動時に CDN URL がパスの前に追加されるため、本番環境でアプリケーションを再起動する必要があります... :/
アイデア?