私はスケーラビリティ上の理由からサーバー上でセッション状態を維持したくないと思っていますが、Play 2.0のアプローチが古い学校のHttpSessionよりも優れているとは言えません。Java EE HttpSessionと比較して、Play 2.0のCookie +キャッシュメカニズムの主な利点(スケーラビリティに関して)は何ですか?
大きな違いは、HttpSessionの実装はコンテナによって提供されるため、HttpSessionのスケーリング機能はそれに依存するということです。
私はスケーラビリティ上の理由からサーバー上でセッション状態を維持したくないと思っていますが、Play 2.0のアプローチが古い学校のHttpSessionよりも優れているとは言えません。Java EE HttpSessionと比較して、Play 2.0のCookie +キャッシュメカニズムの主な利点(スケーラビリティに関して)は何ですか?
大きな違いは、HttpSessionの実装はコンテナによって提供されるため、HttpSessionのスケーリング機能はそれに依存するということです。
これには多くの利点があります。本質的には、Playのセッションモデルは共有なしのアーキテクチャを促進します。つまり、あなたが実行する各アクションは、Playのプロモーションのパターンに従う場合、RESTfulなリクエストであり、アクションの実行は完全に自己完結型です。これは、各リクエストを個別にテストできることを意味し、アプリケーションは一連の個別機能として構築されています。
ここでの原則は、各アクション間の結合が少なく、ファットセッションによって処理される会話状態が少ないほど、コードがよりクリーンでより堅牢になります。副作用として
、あなたはまた、垂直スケーリングよりも通常より安く、そしてスティッキーセッションより複雑かつ危険でいる、水平に複数のノードを追加することによって簡単にスケーリングを持っています。
アプリケーションに状態が単に存在する場合はどうなりますか?自己完結型のリクエストでは、どこからでも取得する必要がありますか?各リクエストの中央データベース? –
はい、databsaeから、または最初はキャッシュから取得し、存在しない場合はデータベースを取得します。アイデアは、httpサーバが死ぬ可能性があり、アプリケーションサーバ層で状態が保持されないために別のサーバが引き継ぐということです。したがって、アーキテクチャをより堅牢にします(DB読み込みによるパフォーマンスの低下) – Codemwnci
コンテナ管理のセッション(およびそのカプセル化状態)を使用すると、水平方向に拡大したいときに、アプリケーションはこの状態を複製する必要があります。アプリケーションを使用するクライアントは、の特定のノードに効果的にバインドされます。対照的に、アプリケーションがいつでも実際のセッション状態を保持していない場合(Playアプリケーションの場合)、アプリケーションを実行するノードをさらに追加して、フロントエンドHTTPサーバーが新しいノードを認識していることを確認してください。すべてのノードでセッションを複製して維持するためのファンシーアルゴリズムと "エンタープライズプラットフォーム"はありません。
IMHOは、JEE HttpSession自体にバインドされていません。特定のコンテナが実装することを選択したのは単なる「機能」です。セッションをグローバルストアに入れることもできます。 –
@AndreasSteffanセッションがグローバルストアに格納されている場合でも、グローバルストアは予見し維持する必要があります。 **あなたがこのインフラストラクチャーを持っていて、それをサポートする人々がいる場合、それは素晴らしいことです。セッションは* bad *ではありません。ステートレスなアプローチはしばしばはるかに容易で効率的です(スケーラビリティと開発の両方に) - IMO :-) – tmbrggmn
いいえ、実際はそれよりも少し複雑です。 Playは実際にステートレスアプリケーションアーキテクチャをプッシュします。つまり、セッションにデータを格納していません。信任状を保存することはできません。
第1規則:セッションストレージはデータベースにデポートされます。セッションからデータを取得する代わりに、データベースから取得します。スケーラビリティは、JVMアプリケーションよりもデータベースの方が簡単です。
第2規則:資格情報以外は何も格納されません。意味、あなたは会話の州のために別の方法で情報を伝える必要があります。これを行うには2つの方法があります。私の意見では、最善の方法ではない隠しフィールドを使用します。次に、絶対URLを使用します。 ids、検索などを含むURLを作成します。
何か不足しているかもしれませんが、コンテナを禁止するものはありませんHttpSessionの実装をデータベースでバックする –
何もありません。あなたはそれをすることができます。しかし、それでもなお、セッション中に強いタイピングはありません。オブジェクトのライフサイクルはどうですか?どの瞬間からあなたのオブジェクトは時代遅れで、セッションを空にするのですか?一般的にjava devはそれをしません。彼らはガベージコレクタに数えられます。セッションタイムアウトはどうですか?どのようにそれらを処理するのですか?これをすべて処理する最も簡単な方法は、セッションを避け、ステートレスなアプリケーションを設計することです。 –
>セッションからデータを取得する代わりに、データベースから取得します - しかし、アプリケーション*ステートレス*か、分散セッション記憶域(各ノードのhttpセッション)を1つの中央セッション記憶域(DB)に置き換えますか? –
playframeworkタグが追加されました。この質問はセッション1とキャッシュ2のプレーに適用されます。 – Codemwnci