.NETエンタープライズ
Webアプリケーション開発技術大全

Sessionオブジェクト

マイクロソフト コンサルティング本部 赤間 信幸
2004/07/15

C. Sessionデータの保存方式の比較

 ここまでの解説を基に考えると、Sessionデータを保存する場所としては、以下の4つの構成パターンがあることになる(図5)。

  • InProcモード(Session情報をWebサーバ上のメモリ内に配置する)

  • StateServerモード(各Webサーバごとにステートサービスを立ててそれを利用する)

  • StateServerモード(専用のステートサービスのサーバを立ててそれを利用する)

  • SQL Serverモード(DBサーバ上にステートデータベースを作り、これを利用する)

図5 Sessionデータ保存の4方式

 この4方式には、速度と耐障害性に関するトレードオフがある。速度に関してはInProcモードが最も高速であり、SQL Serverモードが最も低速である。耐障害性に関しては以下のような違いがある。

・ InProcモードとStateServerモードの違い
  ・ Webサーバの障害時にSessionデータが消失するという点では同じである。
  ・ しかしInProcモードでは、アプリケーションリスタートやプロセスリサイクリング※6が発生した際にもSessionデータが消失する

※6 アプリケーションリスタートやプロセスリサイクリングに関する詳細は、本書「第3章 ASP.NETランタイムの詳細動作」にて解説する。

・ StateServerモードとSQL Serverモードの違い
  ・ Webサーバの障害時にSession情報が失われないという点では同じである。
  ・ しかし、ステートサービスはそれ自体を冗長構成にすることができないため、StateServerモードを利用する場合は、当該サービスがSPOF(単一障害点)となる。
  ・ ステートデータベースを利用する場合、当該DBサーバをMSCS構成とすることで冗長性を持たせることができるため、SPOFを取り除くことができる。

 以上をまとめると、表1のようになる※7

※7 表1の中の速度比較は相対的なものであり、その速度低下がどこまで許容できるのかはアプリケーション要件によって変化する。また、速度低下はSessionデータのサイズに特に大きく左右される。一般に巨大なデータをSessionオブジェクトに格納した場合、InProc以外では致命的に速度が遅くなる(データのシリアライズ処理およびデータ転送処理に時間がかかるため)。しかし、そもそも巨大データはSession情報に入れるべきではなく、またInProcモードは耐障害性が全くないため、運用系では事実上利用できない。これらのことから、Session情報として取り扱うデータサイズが小さくなるようにアプリケーションを設計した上で、SQL ServerモードまたはStateServerモードで利用するのがよい。
 
InProc StateServer
(各マシン単位)
StateServer
(専用サーバ)
SqlServer
処理速度
アプリケーションリスタート
×(データ消失)
プロセスリサイクリング
×(データ消失)
Web サーバのフェイルオーバ
×(データ消失)
×(データ消失)
SPOF有無 アプリケーションリスタート時にもSession 消失 各Web サーバダウン時にSession 消失 ステートサービスダウン時にSession消失 MSCS 併用時にはSPOF なし
速度
良 ←
→ 悪
対障害性
悪 ←
→ 良
表1 Sessionデータ保存の4方式の比較

 表1から分かるように、Session状態の各種の保存方法の間には、速度と耐障害性に関する基本的なトレードオフ関係がある。速度と耐障害性をどこでバランスさせるべきかに関しては、システムに求められる非機能要件によって変化する。このため、当該システムの要件を基に最適な方法を選択しなければならない。

 ただし、一般的なWebアプリケーションの場合、運用系ではSQL Serverモード(ステートデータベース)を利用することが望ましい。これは主に以下のような理由による。

  • ステートデータベースを使うと、高い耐障害性を持たせることが可能である。アプリケーションリスタート、プロセスリサイクリング、Webサーバのフェイルオーバのいずれの場合も問題なく動作を続けることができる。

  • システム構成・運用上、ステートサービス用に専用サーバを用意するよりも、ユーザアプリケーションで利用しているSQL Serverデータベースを、ステートデータベースとしても利用するように構成した方が楽である。

  • Sessionオブジェクトに巨大なデータを格納しない限り、処理速度が問題になることはほとんどない(業務処理全体に対する割合は小さい)。

 また、Sessionデータの保存先は、デフォルトではInProcモードとなっているが、開発中はこれをStateServerに変更しておくことが望ましい。これは主に以下のような理由による。

  • InProcモードを利用した場合、シリアル化できないデータをSessionオブジェクトに格納してもエラーが発生しない。このため、運用系に配置するまで問題に気付けない危険性がある。

  • InProcモードでは、シリアル化やデータ転送処理が一切行われない。このため巨大なデータを格納していても性能劣化がなく、開発者が設計・実装のミスに気付きにくくなってしまう。

D. ステートデータベースの内部構造と動作

 ステートデータベースを利用する場合には、SQL Server内部にどのようなデータベースが作成されるのかを詳しく知っておくと、何かと都合がよい。以下に参考情報として、ステートデータベースの内部構造と、関連するいくつかの注意点をまとめる。

 ステートデータベースは、.NET Frameworkインストールディレクトリ内のInstallSqlState.sqlスクリプトを実行することにより作成することができる。このスクリプトにより作成されるものは以下の3つである。

・ ASPStateデータベース
  ・ Session情報を出し入れするためのストアドプロシージャが含まれる。
  ・ 内部にはユーザテーブルを持たず、実際のデータはこのデータベース中には格納されない
 
・ tempdb上に作られるセッション情報格納用のテーブル
  ・ ASPStateTempApplicationユーザテーブル
  ・ ASPStateTempSessionsユーザテーブル
  ・ 上記2つのユーザテーブルに実際のSession情報が格納される。
 
・ SQLエージェントに登録されるジョブ
  ・ ASPState_Job_DeleteExpiredSessionsジョブ
  ・ このジョブはSQL Agentにより1分間隔で実行され、tempdb.ASPStateTempSessions上に残された失効データが定期的に削除される。

 図6にその関係を図示する。

図6 ASPState、tempdb上のセッション情報格納テーブル、登録されるジョブの関係

 このステートデータベースの動作・構成に関して、以下の2点に注意する必要がある。

・ ステートデータベースを利用する場合には、SQL Agentサービスを停止させてはならない。
  ・ セッションテーブル上に残された失効Sessionデータは、SQL Agentサービスが定期的に実行するジョブによって削除されている。よって、SQL Agentサービスを停止させてはならない。
 
・ 必要に応じて、永続化ステートデータベースを利用する。
  ・ tempdbデータベースはSQL Serverの再起動のつど初期化が行われる。このため、耐障害性向上のためにMSCSクラスタ構成のSQL Server上にステートデータベースを構築していても、フェイルオーバ時にはSession情報が消失してしまう
  ・ しかし、もう1つのインストールスクリプトであるInstallPersistSqlState.sqlを利用すると、セッション情報テーブルをASPStateデータベース内に作成することができる※8
 
※8 このスクリプトは.NET Framework 1.1に同梱されている。.NET Framework 1.0でも、以下のアドレスからスクリプトを単独でダウンロードして利用することができる。
http://support.microsoft.com/default.aspx?kbid=311209

 Sessionデータの格納場所(ステートサービスとステートデータベース)に関する解説は以上である。引き続き、Sessionオブジェクトに格納するデータのサイズに関する注意点を解説する。


 INDEX
  .NETエンタープライズWebアプリケーション 開発技術大全
  Sessionオブジェクト
    1.Sessionオブジェクトに格納可能なデータ
  2.Sessionデータの保存場所と耐障害性(ステートサービスとステートデータベース)
    3.Sessionデータのサイズ(1)
    4.Sessionデータのサイズ(2)
    5.パーソナライズ、セッション、認証済みアクセスの違いと使い分け
    6.画面遷移制御とアプリケーションコントローラ(1)
    7.画面遷移制御とアプリケーションコントローラ(2)
 
インデックス・ページヘ  「.NETエンタープライズWebアプリケーション開発技術大全」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間