みんな大好き ScottGu ブログが更新されて、Windows Azure Web サイト周りが大幅に強化されたことが発表されましたね。
英語を読むのがしんどい人は、さとうなおきさんの翻訳とか No.1 のまとめ記事を読むのをお勧めします。
Windows Azure Webサイトのステージングサポートほかいろいろ « ブチザッキ
さてさて、今回のアップデートで Web サイトはクラウドサービスと同じように、まずはステージング環境にデプロイを行い、そしてスワップすることでダウンタイムなしにアプリケーションの更新を行うシナリオがサポートされました。
元々 Web サイトはダウンタイムがほぼ無いですが、今までは Web Deploy でデプロイしている間はファイルのロックがかかったり、デプロイが終わった後にアプリケーションが立ち上がるのに時間がかかったりするので、素早く新しいバージョンに切り替えるという点ではちょっと苦手でした。
帝国兵さん曰く、アプリケーションプールはスワップでは再起動しないらしいので、ステージングを使うことで改善されるようになります。
@shibayan 再起動しないですー
— Michimune Kohno (@superriver) 2014, 1月 21
アプリケーションプールを再起動させずにスワップを行っているみたいですが、SignalR を使って WebSocket や Server-Sent Events で接続中にスワップを行っても切断されることなく通信が可能みたいです。
実際に SignalR の stateChanged イベントとサーバから定期的にプッシュを行うコードで試してみました。
スワップを行ってから数秒経過していますが、再接続が行われた形跡はなく、ネットワークインスペクタでも Server-Sent Events のストリームは切れていないことが確認できますね。
スワップした瞬間にコネクションが切断されるのではないかと思いましたが、古いページを表示していた場合は古いアプリケーションと通信を行えるのは安全な気がします。別ページに移動したタイミングで新しいページの読み込みと、新しいコネクションを作成するので問題ないですね。
それよりも再接続が集中するとサーバがお亡くなりになる可能性があるので、そちらの方が避けるべき問題だと感じました。
ぶっちゃけ Web サイトの仕組みがますますわからなくなってきましたが、今回のステージング対応で個人的にクラウドサービスを使う理由がまた一つ減り、Web サイトが好きな理由がまた一つ増えました。