2009-07-29 21 views
16

スケーラブルなhttpセッション管理のベストプラクティスはありますか?スケーラブルhttpセッション管理(java、linux)

問題空間:ユースケースの

  • ショッピングカートの一種。ユーザーはサイトの周りを買い物し、最終的にチェックアウトします。セッションを維持する必要があります。各データセンター
  • Javaで
  • 複数のデータセンター
  • 複数のWebサーバーを、Linuxの私はそれを行う方法のトンがあります知っている、と私はいつも自分の具体的な解決策を考え出すことができる

    :しかし、私は、群衆のstackoverflowの者の知恵は私はいくつかのアプローチがあるように思えるのベスト・プラクティスに一般的に

    を集中することができますかどうかを疑問に思いました

  • セッションを維持しないでください。いつも無国籍、宗教的に実行する[私のために働かない]
  • j2ee、ejbとそのギャングの残りの部分を使う
  • データベースを使ってセッションを保存する。
  • セッション(または他の種類の中間的なセミパーシステントストレージ)を格納するためにmemcachedを使用してください。
  • キー値DBを使用してください。 memcachedよりも「より永続的」
  • すべてのセッション情報が隠されたフォームフィールドに存在し、クライアントからサーバーに前後に渡って渡される「クライアントサイドセッション」を使用します。サーバーには何も格納されていません。

ありがとう

答えて

5

私はいくつかの標準的な分散キャッシュソリューションとなるだろう。 あなたのアプリケーションサーバーが提供されている可能性があり、memcachedできる可能性がありますterracotta おそらくあなたが何かを選択したとして、あなたが十分に人気のあるものを使用している限り(バグのほとんどが既に狩りされていることを知っている) 。あなたの他のアイデアについては

  • セッションを保持してはいけない - あまりにも保護されていない - - あなたは
  • 可能クライアント側のセッションではないと述べたと誰かがショッピングカートに割引価格を置くためにクッキーをハッキングと仮定
  • データベースを使用する - 通常、データベースは解決するのが最も難しいボトルネックです。絶対に必要以上にデータベースを置かないでください。

これらは私の2セント:)

複数のデータセンターについてです - あなたはそれが上の開始データセンターへのセッションのいくつかの親和性を持っていることになるでしょう。私は、異なるデータセンター間で動作する分散キャッシュのソリューションはないと思います。

+0

私はこの解決策に傾いていると思います。ちょうど私が正しい方向に向かっていることを検証したいと思った;) – Ran

5

あなたのリストからバニラの複製されたhttpセッションが欠落しているようです。その塩の価値があるサーブレットコンテナは、クラスタ全体のセッションのレプリケーションをサポートします。あなたがセッションに入れたアイテムが巨大ではなく、シリアライズ可能である限り、それを動作させるのはとても簡単です。

http://tomcat.apache.org/tomcat-6.0-doc/cluster-howto.html

編集:それはそうです、しかし、そのTomcatのセッション・レプリケーションは、大規模なクラスタにうまくスケールしません。そのために、私は「バディレプリケーション」のアイデアを提供したJBoss + Tomcatを、使用することをお勧めします:

http://www.jboss.org/community/wiki/BuddyReplicationandSessionData

+0

Tomcat 6.0、右? – Ran

+0

現在のバージョンと同じくらい、はい。 JBossにはTomcatの組み込みバージョンが同梱されています。 – skaffman

1

私は個人的にこのようなクラスタを管理していませんでしたが、私は大学でJ2EEコースを受講したときに講師がデータベースにセッションを保存すると言ってキャッシュしませんでした。 (とにかく意味のある方法で動的ページをキャッシュすることはできません).HTTPセッションは、session-idがクッキーであるため、クライアント側で定義されています。クライエントがクッキーの保存を拒否した場合(例えば、トラッキングについての妄想)、セッションを行うことはできません。 HttpSession.getId()を呼び出して、このIDを取得できます。

もちろん、データベースにはボトルネックがあるため、2つのクラスタ、つまりアプリケーションサーバークラスタとデータベースクラスタになります。

私の知る限りでは、ステートフルメッセージBeanと通常のサーブレットHTTPセッションの両方を内蔵負荷分散することなく、メモリ内にのみ存在する。

ところで。私は隠しフィールドに電子メールアドレスやユーザー名を格納しませんが、おそらくカートの内容はその重要なデータではありません。

1

私はむしろ、ユーザアプリケーション状態をHTTPセッションに格納することから離れていますが、それはアプリケーションがどのように動作するかを考え、RESTfulステートレスアーキテクチャを使用する必要があります。これは、通常、クライアント側でMVWWアーキテクチャーをサポートしていない旧バージョンのブラウザーのサポートを中止することを含みます。

ショッピングカートは、それがデータベースに格納され、そのように管理されることを意味するアプリケーション状態あるユーザアプリケーション状態ありません。カートの共有が可能であると仮定して、1つまたは複数のショッピングカートにユーザをリンクさせる関連付けテーブルが存在し得る。

ステートレスの場合は、すべてのリクエストに対してユーザーを認証する方法が最も難しいでしょう。 BASIC認証はセッションを伴わない最も単純なアプローチです.FORM-authはセッションを必要としません。 JASPICの実装(HTTPヘッダーやOAuthなど)は、認証の問題を他の場所で緩和することができます。この場合、Cookieを使用して認証トークン(FORM-authなど)やSiteMinderのようなHTTPヘッダーやApache 。

DB2などの高価なデータベースには、複数のデータセンターで機能する高可用性と障害回復機能があります。ネットワークトラフィックによる大きな影響があるため、データベースの負荷分散のためのものではありません。