はじめに
Windows Azure SDK 1.4より新しくASP.NET Universal Providersというセッション管理のパッケージが同梱されるようになりました。これ以前にはWindows Azureキャッシュを利用する方式が提供されていたり、Windows Azureストレージを利用したサンプルが公開されていました。同梱されたことによって、また一つ選択肢が増えたことになります。本稿では、従来から提供されている方式とともに比較し、ASP.NET Universal Providersについて解説します。
対象読者
- Windows Azureの概要を理解している方。
- Windows Azureのサブスクリプションを持っており、Azureを利用したことがある方。
必要な環境
- Windows Azureサブスクリプション
- Visual Studio 2010もしくは、Visual Web Developer 2010 Express
- Windows Azure SDK for .NET ‐2011年11月(SDK 1.6)
Windows Azureのセッション管理について
セッション管理は、Webアプリケーションを開発する上で必須です。従来のASP.NETアプリケーションは、インプロセスモード、SQL Serverモード、ステートサーバーなどでセッション情報の管理ができましたが、これらの方法はWindows Azure上で利用できないものがあります。
Windows Azureの各ロールインスタンスへの通信は、必ずロードバランサーを経由しますが、このロードバランサーにはセッション維持機能が実装されていません。したがって、各リクエストはロードバランサーで分散され、任意のインスタンスと通信することになります(図1)。
例えば、1回目のリクエストはWebロールのインスタンス1、2回目のリクエストはインスタンス2へと振り分けられます。このときはインプロセスモードのように各インスタンスのメモリ上にセッション情報を保持しておく仕組みであった場合に、2回目のリクエストで、本来あるはずのデータが見つからずに問題となります。
そこでWindows Azureではセッションデータをロールインスタンスの外で管理するのが一般的です。現在、利用できるセッション管理方法には以下があります。
アプリケーション構成ファイル(Web.config)の設定を変更することで、同一コードで異なるセッション管理方法を選択できます。
- SQL AzureでSQL Serverモードを利用
- ASP.NET Universal Providerを利用
- Windows Azureキャッシュを利用
- Windows Azureストレージサービスを利用
それでは、それぞれの特徴を解説します。
SQL Serverモード
SQL Serverモードのセッション管理を、SQL Azureを利用して実現する方法です。セッション状態プロバイダーも.NET標準のものを利用できます。状態を管理するためのテーブルなどを設定するツールは、.NET Frameworkに付属するものは利用できないため、マイクロソフトのWebサイトよりダウンロードしてくる必要があります(注1)。
この方法にはいくつか制限があります。1つは正式にサポートを受けられない点です。2つ目は、有効期限が切れたセッション情報が自動的に削除されない点です。通常のSQL Serverであれば、SQL Serverエージェントによって削除されるように構成されますが、現時点ではSQL Azureにエージェント機能は存在しません。したがって、Workerロールやオンプレミス側から、定期的に有効期限切れのセッション情報を削除するプロシージャを実行する必要があります。
ASP.NET SQL Server登録ツール(aspnet_regsql.exe)です。登録ツールは、「KB2006191」からダウンロードできます。
ASP.NET Universal Providers
ASP.NET Universal Providersは、Windows Azure SDK 1.4からパッケージとして同梱(注2)されるようになったセッション管理方法です。SQL Serverモードと同じくセッション情報はSQL Azureに保管しますが、以下の点で異なります。
- ASP.NET Universal Providerで提供されているカスタムセッション状態プロバイダーを利用する
- 管理に必要なテーブルなどは、初回の接続時に動的に作成される
- 有効期限切れのデータは、任意の接続タイミングで削除される
したがって、運用方法がSQL Serverモードに比べて簡素化されていますが、接続タイミングによっては、セッション情報の読み書き以外の管理処理が実行されるため、レスポンスが悪化する可能性があります。また、SQL Serverモードと同様に正式なサポートは受けられません(注3)。
NuGetギャラリーからも取得可能です。
詳細な使用許諾は、同梱されているEULA.rtfを参照してください。
Windows Azureキャッシュ
Windows Azureのサービスとして提供されているキャッシュ機能を利用する方法です。セッション状態管理プロパイダーは、SDKに同梱されています。詳細は、「Windows Azure AppFabric Cachingでスケールアウトを実現しよう」で紹介しているため、そちらを参考にしてください(注4)。特徴として以下が挙げられます。
- オンメモリであるため性能が良い
- SQL Azureと比較して価格が高い。128MB 同時接続数10までで¥4,000弱
- サポートが受けられる
現在ではWindows Azure AppFabricという名称は使われなくなっています。
Windows Azureストレージサービス
最後はWindows Azureストレージサービスを利用したセッション管理です。Windows Azureのサンプルプログラムに含まれています。特徴として以下が挙げられます。
- SQL Azureやキャッシュに比べてコストが安い
- キャッシュやSQL Azureを利用した場合に比べて性能は低い
- サンプルであるためサポートが受けられない
サンプルソースは、「Windows Azure ASP.NET Providers Sample」からダウンロードできます。
これらのセッション管理方法の特徴をまとめると下表の通りです。サポートについてはカスタムセッション状態プロバイダーについてであって、情報のストア先については通常通りサポートを受けられます。
SQL Severモード | ASP.NET Universal Providers | Windows Azure キャッシュ | Windows Azure ストレージ | |
コスト | ○ 1GB 900円 ~ |
○ 1GB 900円~ |
× 128MB 4000円~ |
◎ 容量とトランザクションに影響するがSQL Azureよりは安い |
サポート | なし | なし | あり | なし |
利点 | 従来の方法の延長線上で利用可能 | SQL Serverモードより簡易に運用できる | インメモリキャッシュであるため高速 | コストが安い |
欠点 | 期限ぎれのセッション情報が削除されない | 接続タイミングによってレスポンスが悪化 | コストが高い | ストレージを利用するため低速 |
選択の基準としてどの程度のコストを見込んでいるのか、利用にあたって十分なレスポンスが期待できるかなどから、これから提供しようとするサービスの要件にあった方式を選択することになります。いずれにしても、Windows Azureキャッシュ以外は、利用者責任となることに注意してください。
Windows Azure上で、インプロセスモードが動作しないわけではありません。通常のWindows Azureアプリケーションは、SLAや可用性の関係上から2インスタンス以上での稼働が推奨されています。これらのサポートを受けないかわりに1インスタンスで稼働するのであればインプロセスモードで運用することは可能です。