WebアプリケーションにおけるHttpSessionのアレとかソレ。

僕が、HttpSessionをやたらと使うテクノロジに懐疑的な理由をちょっとだけ。


実装上の話と設計上の話に分けて考えてみたり。

まずは、「JavaにおけるHttpSession」が、アレでナニな理由。


HttpSessionが、どの様に保持されるかは、APサーバの実装依存
つまり、どういう事かというと、HttpRequestのたんびに、どっかにシリアライズしてもイイのです。
大抵のAPサーバは、HttpSessionの内容を常に全てメモリ上に保持する訳ではありません。
好き勝手なと言うと、語弊がありますが、ある程度のタイミングでシリアライズします。
それによって、使用されるメモリの量を抑える様になっています。
これが、適切に動作するか否かは、状況依存なので、
決定的な事は何とも言えないのですが、ポイントは、一つだけ。


HttpSessionにオブジェクトが大量にぶら下っていると、
シリアライズ<-->デシリアライズが走り易くなるのです。


これによって、ナニが起こるかと言うと、
HTMLの描画を中心にしたパフォーマンステストでは、
適切なスループットをマークできるにも関わらず、
ブラウザ越しに使うと、「何か遅い」と言う事になります。
具体的に言うと、JMeterでテストしてると、イケイケドンドンなのに、
極端な場合、10人で同時にアクセスしただけで、どうにも真っ白な画面ばっかりやん。
みたいな事になります。
Cookieをきっちりやりとりしつつテストすれば、問題は明らかになる筈なんですけどね…。


Javaでは、シリアライズ<-->デシリアライズのコストは非常に高く、
それだけで、ボトルネックを生み出す程です。
また、シリアライズしているという事は、ローカルディスクのIOが発生すると言う事なので、
少なからず同期処理が何らかの形で行われる事になります。
1.4までのJavaでは、同期処理は非常にチープです。
もうね、ロックするかしないか…位のハンドリングしか出来ません。
しかも、極まった状態では、想像を絶する動きをする事もあります。


Javaの同期処理に関するお話は、この辺を参考にして下さい。

次に、設計上のアレでナニな部分を考えてみます。


状態を保持できない筈の、HTTPにおけるセッションと言うやつは、
非常に便利な反面、それなりに無理を抱えています。
その中で、僕が最も重視しているのは、
ライフサイクルモデルが、超いいかげんな事です。
オブジェクトを作って、セッションに追加するのは、任意のタイミングでやれば、イイでしょう。
デモネ、サーバ上で確保したオブジェクトは、全部ちゃんと消せるの?
って事です。


Webシステムは、ログインして貰うのは簡単でも、
ログアウトして貰うのは簡単ではありません。
なぜなら、ブラウザの右上辺りにある「×」マークをクリックしちゃう、
もしくはそれに類似する行為を行う事で、システムの利用者側としては、
システムの利用を中断してしまうから。
困った事です。何やら特別な方法を使わなければ、その「閉じる」をトレースして、
サーバ側で自動的にログアウト。みたいな事は出来ません。
そもそも、HTTPにはその様な規定は存在しません。
セッションCookieにしても、サーバ側で発行したものを、
クライアント側で、きちんと終了しましたって送ってくれるなんて期待出来ません。


これに対する、唯一にして、後ろ向きな解決策は、
セッションタイムアウトってやつだけです。
1分ですか?10分ですか?それとも、1時間ですか?
適切な時間を設定するのは、非常に難しいです。
結果的にみて、問題が起こり難い時間を設定する事は可能ですが、
本質的な問題は解決していません。


HttpSessionに、いつ、何が格納され、それらは、どの様にして削除されるか?
また、セッションタイムアウトまで削除されない可能性のあるモノは何か?
キチンと把握しているのであれば、そんなに重大な問題が起こる事は稀でしょう。


しかしながら、汎用的な仕組みとして、
HttpSessionに「何か」を格納するテクノロジのほとんどは、
その「何か」が、最終的に破棄されるタイミングを制御する事はありません。
「ま、タイムアウトすりゃ消えるんだし、イイジャン」ってなもんです。
その量が少ないうちは、問題になり難い筈ですが、
それが多くなった時に果たして、同じままで大丈夫なのか、不安に感じる為、
僕としては、HttpSessionにオブジェクトを大量に格納する可能性のあるテクノロジを
手放しで良いと言う事は出来ません。


HttpSessionが、ある程度、Cookieに依存せざるを得ないテクノロジである以上、
セキュリティの問題もある訳で、その最たるものが、CSRFなんだけど、
それは、まぁ、他のサイトにイッパイ情報があるし、そっちを見て下さいな。


んでね、RIAに期待する理由のなかで、非常に大きい位置を占めているのが、
この問題に対する解決策足りえる事なんです。
HttpSessionを使わずとも、状態情報をキッチリ押さえられるんなら、
サーバ側で、そんな面倒な事や、ゴマカシをしなくていいんなら、凄くイイ。


いや、リッチな画面は、まぁ、確かに喜んで頂けるので嬉しいですよ。勿論。