かつのりの日記2

わんくまでは珍しいJavaを中心とした日記です

目次

Blog 利用状況

書庫

日記カテゴリ

いろいろリンク

セッションの話

一部でセッションの話が盛り上がっていますが、JavaではFilterあたりでセッションオブジェクトをカスタムのセッションオブジェクトに差し替えます。HttpSessionという型はインターフェイスなので、実際はどんな実装になっていても、機能だけ満たせば問題ありません。

よくセッションで問題となるのが、

  • 同一コンテキスト上の他のアプリのセッションの破壊
  • スケーラビリティ
  • サーブレットAPI依存

あたりです。

セッションの破壊は暗黙の名前空間を取り入れるのがベストでしょう。凪瀬さんのエントリの中にもコメントしましたが、同一アプリ上の同一業務をサブコンテキストとみなし、サブコンテキスト単位で名前空間を暗黙的に持つ方法です。

実セッションにはサブコンテキストを示す名前空間をキーにマップオブジェクトをバインドします。セッションが要求された場合はマップをセッションのインターフェイスでラップして操作させます。アプリ側ではサブコンテキストなんて概念は考える必要はありません。

次にスケーラビリティですが、サーバを複数台にしたい場合や、純粋にセッション数が多くても対処できるようにしたいという場合があります。

サーバを複数台にするためには、AサーバとBサーバがあったとして、Aサーバに格納されたセッションの情報をBサーバで取得できなければなりません。そのためにTomcatあたりではTCPで常にグループ間で同期を取るようになっています。この辺も同期が取られているかをアプリが意識する事はありません。

セッション数に対応するにはDBやファイルシステムに書き込むのがベストでしょう。DBであれば、複数台から同一の情報が取得できる為、分散化にも繋がります。

最後に、サーブレットAPI依存を防いで極力POJOにしたいケースです。この場合はDIコンテナを組み合わせるのがベストでしょう。SpringやSeasar2を使って、セッションをインジェクションし、利用するクラスは単なるドメインモデルとして扱うのがシンプルです。

投稿日時 : 2007年10月4日 1:24

Feedback

# re: セッションの話 2007/10/04 7:53 けろ

>「サーバを複数台にするためには、AサーバとBサーバがあったとして、Aサーバに格納されたセッションの情報をBサーバで取得できなければなりません」

ロードバランスの時も意識しないといけないですよね。
今、この言葉で、そうだ!って思いました。

>TCPで常にグループ間で同期を取るようになっています

Tomcatにはそんな機能があるんですね。知りませんでした。
IISにもあるのかなぁ~。ちょっと調べてみます。

# re: セッションの話 2007/10/04 9:59 かつのり

ロードバランシングでも、スティッキーセッションではあまり意識しませんね。
ラウンドロビンになると大変です。

スティッキーセッションではフェイルオーバーが大変なので、
ノードA(サーバ1、サーバ2)、
ノードB(サーバ3、サーバ4)
という構成にして、同一ノードへはスティッキーセッション、
同一ノード内ではラウンドロビンというのが楽そうです。
冗長化はノード単位で増やすと、セッション同期のオーバーヘッドも少なそうですし。

# re: セッションの話 2007/10/04 12:53 凪瀬

その凪瀬さんのエントリ
http://blogs.wankuma.com/nagise/archive/2007/10/02/99111.aspx

結構わんくまblogは検索上位にひっかかるので、検索園児から来た人のために情報のリーチャビリティを確保するようにしておいたほうがいいかも。

実は自分はロードバランサ入った環境の構築をしたことがないんですよね。
APIにセッション情報を同期させるためのリスナがあることは知っているけど。

# re: セッションの話 2007/10/05 17:59 けろ


ラウンドロビンまでは考えてませんでした orz

>ノードA(サーバ1、サーバ2)
>ノードB(サーバ3、サーバ4)

なるほど。これなら同期した際のオーバーヘッドは
少なく済みそうですね。
ノード構成も考慮したものにしないとダメですね。
難しいです orz

タイトル
名前
Url
コメント