.NETエンタープライズ 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アプリケーション開発技術大全」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|