- PR -

sessionを使用できない場合の設計について?

1
投稿者投稿内容
たかたか
会議室デビュー日: 2003/01/21
投稿数: 4
投稿日時: 2003-05-20 14:06
初めて投稿しますがよろしくお願いいたします。

この度予約システムを作ることになったのですが
あまり予算がないが同時アクセスはかなりの数に上るため
Tomcatにて複数台サーバーを立てて対応することになりました。
しかし上記の場合はセッションを使用することが出来ません。
(ロードバランサにより常に同じサーバーに飛ばす案は他システムとの絡みで
 却下になりました)

で本題なのですがセッションを使えない場合に画面間で情報を渡したい場合に
みなさんならどの様な設計案がありますか?

単純にHIDENタグだとオブジェクトを保存しておけないのでかなり泥臭い実装に
なってしましますしかと言ってオブジェクトをDBへシリアライズするのは
パフォーマンス的に心配です。

このような場合にみなさんならどの様な設計or実装を考えるか意見を
参考にさせて下さい。
よろしくお願いします。

へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2003-05-20 16:59
これは難題ですね。
画面間で引き継ぐべきオブジェクトはどの程度複雑なものでしょうか?
引用:

単純にHIDENタグだとオブジェクトを保存しておけないのでかなり泥臭い実装


構造が比較的単純でサイズがそれほど大きくなければ、base64か何かで文字列にエンコーディングし、HIDDENタグなどに埋め込むことで何とかなるかもしれません。
が、DBへシリアライズするのがパフォーマンス上気になるのなら、この方法も無理そうですね。
たかたか
会議室デビュー日: 2003/01/21
投稿数: 4
投稿日時: 2003-05-20 17:47
返信ありがとうございます。
やっぱり難題ですか・・・
引用:
--------------------------------------------------------------------------------
画面間で引き継ぐべきオブジェクトはどの程度複雑なものでしょうか?
--------------------------------------------------------------------------------
現状考えているのはテーブル項目をマッピングしたBeanまたはそのBeanの
Listを引き渡したいと考えています。
単純な項目であればHIDDENでいけると思っていたのですがよくありがちな
一覧を選択して次の画面でその選択した一覧を処理するという様な動きを
想定しています。

いろいろな方法を検討したいと思っていますのでこんな方法は?
などの助言をよろしくお願いします。
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2003-05-20 18:11
予約システムというと、インターネットだと思うので、難しいとは思いますが……。

一覧表示からの処理をアプレットにする。
「一覧を選択して次の画面でその選択した一覧を処理する」といった、同一データを保持すべき画面をすべてアプレットにして、ユーザのブラウザ上でFrameやPanelの切り替えで表示する。
最終的にデータを保存する段階になって、初めてTomcatへPOSTする。

これならTomcat上での画面遷移はないので、オブジェクトの引継ぎは不要になります。
が、VMのバージョンとかAWTとかアプレットのダウンロード時間とか、面倒は増えます。(^^;
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-05-22 00:14
1.DBへシリアライズのパフォーマンス計測
 心配との事ですが、テストケースで実測してみてはどうでしょうか。
 「やっぱり遅い」と出るか、「使える」とでるか。
 もし、実用にならなかったとしても、「あとちょっと」なのか
 「全然だめ」かにより、その後の方策を練るため手掛かりになると思われます。

2.同じサーバーに飛ばす案
 却下になったのが、同じサーバの使用ではなく、ロードバランサにそれを
 調整させることであればという前提で。
 HIDDENタグに(オブジェクト自体ではなく)元サーバ名とセッションIDを
 持たせて、それを手がかりにフォワードするのはどうでしょう。
 DBへのシリアライズよりは軽いと思われますが。
(あっ、それなら普通のセッションIDとの併用も可能かも。)

でも予算がないのに、高負荷のサーバ構築、運用というのが一番心配です。
くれぐれもミズホ現象だけは起こさないように祈っております。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-05-22 12:03
Javaオブジェクトをバイト列にシリアライズしてからBase64でエンコードして、
HIDDENタグに埋め込むのはどうでしょう?
Base64のcodecならjakartaにありますね。
http://jakarta.apache.org/commons/codec/

受け取ったリクエストから HIDDEN フィールドを自動的にデコードして、
HttpServletRequestに setAttribute() するようなフィルタを作ると楽かもしれません。
シリアライズ<->デシリアライズが発生するのに変わりはありませんが、DBに保存する
よりは早いはずです。

セキュリティ上はちょっと心配ですね。セッション情報解析されたら改竄できてしまい
ますから。

サーバを一杯たてる予算があるならば、サーバの数を減らしても、WebLogic などのよりパフォーマンスがよく、クラスタ対応のサーバを導入してしまう方が結果安いことも多いです。
クラスタ化しなくても、セッションIDを使った振り分けは Webサーバでできますし。
http://edocs.beasys.co.jp/e-docs/wls/docs70/plugins/index.html

[ メッセージ編集済み 編集者: インギ 編集日時 2003-05-22 12:08 ]
たかたか
会議室デビュー日: 2003/01/21
投稿数: 4
投稿日時: 2003-05-23 09:10
>へげもんさん
今回のシステムとしてアプレットでは製造できないため・・・

>Kissingerさん
やはりDBへのシリアライズが簡単だとは思うのですがどのタイミングで
データを削除するのかなどの考慮が必要ですよね。
一通り案を提出してすべてのプロトを作成しパフォーマンス検証を
行ってみます。

>インギさん
こういうやり方もあるんですね!
調べて実験してみたいと思います。
サンプルサイトなどありましたら教えていただけませんか?

みなさん色々な案をありがとうございます。
もしまだこんなのがあるよって案がありましたら引き続き
お願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-05-23 11:12
たかたかさん
>調べて実験してみたいと思います。
>サンプルサイトなどありましたら教えていただけませんか?
ごめんなさい、思いつきで書き込んだだけです。実装例はみたことがありません。
あと、仕組み上、フレームを使った画面は難しいですね。

Httpセッションをサーバ間で共有する戦略としては、代表的なものに
(1)DB
セッション情報を毎回RDBMSに保存する。
(2)ファイル
セッション情報を共有ディスクに保存する。
(3)クッキー
セッション情報をすべてクライアントのクッキーに保存する。
(4)インメモリレプリケーション
ネットワーク越しにサーブレットコンテナ間でセッション情報を伝搬し合う。

の4種類があります。一般に後者の方が高速です。
Tomcat でも DB を用いた共有(1)は 3.2.x (くらい?)から実装されています。
Tomcat5.xでインメモリレプリケーション(4)が実装され、いくらかTomcat4.xにも
バックポートされているようですが、実績については存じません。
http://cvs.apache.org/~fhanik/index.html
http://www.theserverside.com/resources/article.jsp?l=Tomcat

しかし、サーバ台数が多い場合はレプリケートのコストがばかになりません。
商用サーバでは、クラスタのなかでも、仲良しのサーバを決めて無理に全員で
全てのセッションを共有しないで済むような最適化が図られます。
http://edocs.beasys.co.jp/e-docs/wls/docs70/webapp/sessions.html
http://edocs.beasys.co.jp/e-docs/wls/docs70/cluster/failover.html#942827

独自のセッション機構をがんばって実装する前に、まずは非常にシンプルな
プロトタイプアプリケーションを作って、jMeterなどで定量的なデータを測定
してみましょう。
もしかするとTomcat内蔵の仕組みで十分かもしれませんし、もしかするとサーバ
台数半分にしても商用サーバを使ったほうが早くて安いかもしれませんよ。

"予約システム"で、アクセス数が多いとのことなので、イントラのアプリケーション
ではなく、一般に公開されるサイトではないかと想像します。
繰り返しますが、クライアント側にセッション情報を持たせるのは非常に大きな
リスクを伴うことに気を付けて下さい。

[ メッセージ編集済み 編集者: インギ 編集日時 2003-05-23 11:17 ]
1

スキルアップ/キャリアアップ(JOB@IT)