Oracle® Fusion Middleware Oracle Coherence*WebでのHTTPセッション・マネージメントの管理 12c (12.2.1.3.0) E90215-01 |
|
![]() 前 |
![]() 次 |
この章の内容は次のとおりです。
HttpSessionCollection.SessionDistributionController
インタフェースを使用して、Webアプリケーション内のHTTPセッションと属性をオーバーライドできます。default-session-cache-config.xml
ファイルを使用してセッション・キャッシュを構成します。セッション・モデルは、Coherence内のセッション状態をCoherence*Webでどのように保存するのかを記述します。
この項には次のトピックが含まれます:
セッション・データはHttpSessionModel
オブジェクトで管理し、Webアプリケーションのセッション・コレクションはHttpSessionCollection
オブジェクトで管理します。web.xml
ファイルでコレクション・タイプのみを構成する必要があります。モデルはコレクション・タイプから暗黙的に派生します。Coherence*Webは、次のような様々なセッション・モデル実装を備えています。
モノリシック・モデルでは、すべてのセッション状態を単一のエンティティとして保存し、すべての属性を単一の操作としてシリアライズおよびデシリアライズします。
トラディショナル・モデルでは、すべてのセッション状態を単一のエンティティとして保存しますが、属性は個別にシリアライズおよびデシリアライズします。
スプリット・モデルは、トラディショナル・モデルを拡張したモデルですが、大きなセッション属性は独立した複数の物理エンティティに分離します。
この項では、セッション・モデルについて詳しく説明します。
「セッション・モデルの推奨事項」では、アプリケーションに対してどのセッション・モデルを選択するかについての推奨事項を示します。
「セッション・モデルの構成」では、システム・プロパティまたはコンテキスト・パラメータを使用してセッション・モデルを変更する方法について説明します。
「クラスタ化環境でのデータの共有」では、JVM間およびJVM内でデータがどのように共有されるかについて説明します。
「スケーラビリティとパフォーマンス」では、スケーラビリティおよびパフォーマンスへのセッション・モデルの影響について説明します。
注意:
一般的に、同じCoherenceクラスタに属するWebアプリケーションは、同じセッション・モデル・タイプを使用する必要があります。構成に一貫性がないと、デシリアライズ・エラーが発生することがあります。
図4-1は、3つのセッション・モデルを示しています。
モノリシック・モデルは、MonolithicHttpSessionModel
オブジェクトとMonolithicHttpSessionCollection
オブジェクトで表されます。これらはトラディショナル・モデルと似ていますが、すべての属性を単一のオブジェクト・ストリームにシリアライズおよびデシシアライズすることで共有オブジェクトの問題を解決している点が異なります。そのため、モノリシック・モデルはトラディショナル・モデルよりパフォーマンスが低下することがよくあります。
図4-2に、データの論理表現とセッション記憶域キャッシュにおけるその物理表現の関係を示します。論理表現では、セッション・データはメタデータと様々な属性で構成されます。セッション記憶域キャッシュの物理表現では、メタデータと属性は単一のストリームにシリアライズされます。メタデータと属性にはセッションIDが関連付けられます。
トラディショナル・モデルは、TraditionalHttpSessionModel
オブジェクトとTraditionalHttpSessionCollection
オブジェクトで表されます。TraditionalHttpSessionCollection
オブジェクトはHTTPセッション・オブジェクトを単一のキャッシュに格納しますが、各属性を個別にシリアライズします。
このモデルは、HTTPセッション・オブジェクトが比較的小型で(10KB以下)、セッション属性間でオブジェクト共有の問題が発生しない用途に最適です。セッション属性間のオブジェクト共有は、1つのセッションにある複数の属性で同じオブジェクトを参照する場合に発生します。このような状況では、HTTPセッションを後でデシリアライズすると、これらの属性のシリアライズとデシリアライズが独立して実行されるので、共有オブジェクトの複数のインスタンスが発生します。
図4-3に、データの論理表現とセッション記憶域キャッシュにおけるその物理表現の関係を示します。論理表現では、セッション・データはメタデータと様々な属性で構成されます。セッション記憶域キャッシュ内の物理表現では、メタデータと属性はバイナリに変換され、これらにセッションIDが関連付けられます。属性は、単一のバイナリBLOBとして(モノリシック・モデルのように)ではなく、個々にシリアライズされることに注意してください。
スプリット・モデルは、SplitHttpSessionModel
オブジェクトとSplitHttpSessionCollection
オブジェクトで表されます。SplitHttpSessionCollection
はCoherence*Webで使用されるデフォルトです。
これらのモデルは、主要HTTPセッション・メタデータとすべての小型セッション属性を、トラディショナル・モデルと同じ方法で格納します。これによって、バイナリ・セッション・データのブロックを小型に維持できるので、高いパフォーマンスが得られます。すべての大型の属性は、独立したキャッシュ・エントリに分割して別々に管理するので、リクエストが発生するたびにクラスタ内でアクセスまたは更新を必要とするデータ量を増やさずに、大規模なHTTPセッション・オブジェクトをサポートできます。つまり、属性の更新によってネットワーク・オーバーヘッドが発生するのは、特定のリクエストで大型の属性を変更する場合のみです。したがって、一般的にスプリット・モデルでは、主要なHTTPセッション・データへのアクセスでも、またどのセッション属性へのアクセスでもネットワーク・オーバーヘッドがほとんど発生しません(これはニア・キャッシュを使用しているからです)。
図4-4に、データの論理表現とセッション記憶域キャッシュにおけるその物理表現の関係を示します。このモデルでは、大型のオブジェクトは独自のセッションIDを持つ個別のキャッシュ・エントリとして格納されます。
次に、アプリケーションに対してどのセッション・モデルを選択するかについて推奨事項を示します。
スプリット・モデルは、ほとんどのアプリケーションにお薦めできるセッション・モデルです。
トラディショナル・モデルは、HTTPセッション・オブジェクトが小型であることがわかっているアプリケーションに適しています。
モノリシック・モデルは、複数のセッション属性で1つの共有オブジェクトを参照し、そのオブジェクトを共有オブジェクトとして維持する必要がある場合、それら複数のセッション属性に関連する特定のクラスの問題を解決することを目的としています。
注意:
セッション・モデルの構成に使用するパラメータの詳細は、「Coherence*Webコンテキスト・パラメータ」を参照してください。
デフォルトではCoherence*Webは、大型の属性が独立したキャッシュ・エントリに分割され、個々に管理されるスプリット・セッション・モデルを使用します。Coherence*Webにより使用されるセッション・モデルは、-Dcoherence.sessioncollection.class
システム・プロパティを構成するか、Webアプリケーションのweb.xml
ファイル内の同等のcoherence-sessioncollection-class
コンテキスト・パラメータを設定することにより変更できます。コンテキスト・パラメータ(またはシステム・プロパティ)の値として、HttpSessionCollection
実装の完全修飾クラス名を使用します。
com.tangosol.coherence.servlet.SplitHttpSessionCollection
(デフォルト)は、スプリット・モデルを構成します。
com.tangosol.coherence.servlet.MonolithicHttpSessionCollection
は、モノリシック・モデルを構成します。
com.tangosol.coherence.servlet.TraditionalHttpSessionCollection
は、トラディショナル・モデルを構成します。
例4-1は、モノリシック・モデルを構成するためのweb.xml
エントリを示しています。
例4-1 セッション・モデルの構成
... <context-param> <param-name>coherence-sessioncollection-class</param-name> <param-value>com.tangosol.coherence.servlet.MonolithicHttpSessionCollection</param-value> </context-param> ...
クラスタリングによって、アプリケーションのスケーラビリティと可用性を高めることができます。Coherence*Webなどのクラスタリング・ソリューションは開発者の多くの問題を解決しますが、開発を成功させるためには、基礎となるテクノロジの制限とその対処方法を認識する必要があります。開発者は、プラットフォームが提供する機能とユーザーの要求内容を把握することによって、これら2つの間のギャップを埋めることができます。
セッション属性を複数のJVM間で処理する場合は、属性をシリアライズ可能にする必要があります。これはクラスタリングでは必須です。セッション属性の一部のフィールドを非クラスタ化することもできます。その場合、対象のフィールドを一時フィールドとして宣言します。それによって、セッション属性のすべてのフィールドをシリアライズ可能にする必要はなくなりますが、このような属性はバックアップ・サーバーに完全にレプリケートされません。アプリケーションの開発時にこのアプローチを採用する場合は、属性フィールドが失われても、アプリケーションで一貫性のある動作が可能なことを入念に確認する必要があります。一般に、このアプローチを採用すると、すべてのセッション属性をシリアライズ可能オブジェクトに単純に変換する場合よりも、作業が難しくなります。しかし、セッション内でユーザー固有のデータが大量にキャッシュされる場合は、このパターンが役立つことがあります。
Java EEサーブレットの仕様(バージョン2.2、2.3および2.4)では、サーブレットのコンテキストをクラスタ内で共有しないように規定しています。サーブレットのコンテキストをシングルトン・データ構造として使用している非クラスタ化アプリケーションでは、クラスタ化環境への移行時に移植の問題が発生します。
クラスタ化環境で発生する、より複雑な問題として、オブジェクトの共有の問題があります。クラスタ化されていないアプリケーションでは、2つのセッション属性が共通オブジェクトを参照している場合、その共通オブジェクトに対する変更は両方のセッション属性の一部として参照可能です。しかし、クラスタ化されたアプリケーションでは、多くの場合、これと異なります。ほとんどのセッション管理の実装では、計算リソースを無駄に使用しないために、必要に応じて個別にセッション属性のシリアライズとデシリアライズが実行されます。Coherence*Webは、(トラディショナルおよびスプリット・セッション・モデルにおいて)通常、この方法で動作します。共通オブジェクトを参照する2つのセッション属性を個別にデシリアライズする場合、共有されている共通オブジェクトは2回インスタンス化されます。共有されているオブジェクトの動作に依存する、容易に修正できないアプリケーション向けに、Coherence*Webは、セッション・オブジェクト全体を単一操作としてシリアライズおよびデシリアライズするモノリスティック・セッション・モデルのオプションを備えています。これによって、もともとクラスタリングを考慮して設計されていないアプリケーションに対する互換性が確保されます。
多くのプロジェクトが、複数のWebアプリケーション間でのセッション・データの共有を必要とします。この場合の課題は、通常、Webアプリケーションごとに固有のクラス・ローダーがあることです。それが原因で、Webアプリケーション間でのオブジェクトの共有が難しくなります。回避策として使用できる一般的な方法が2つありますが、それぞれ固有のトレードオフがあります。
共通クラスをJava CLASSPATHに配置することによって、共通クラスのインスタンスを複数のアプリケーションで共有できます。ただし、この場合、構成が通常より若干複雑になります。
Coherence*Webを使用して、クラス・ローダーの境界間でセッション・データを共有します。各Webアプリケーションは、たとえ同じJVM内で実行されていても、独立したクラスタ・メンバーとして扱われます。このアプローチでは、Webアプリケーション間が疎結合されます(シリアライズ・クラスが共通のシリアル・バージョンUIDを共有していることが前提となります)。ただし、この場合、クラスタ・メンバー間の転送のためにオブジェクトをシリアライズ/デシリアライズする必要があるため、パフォーマンスに影響します。
クラスタ化環境への移行時には、セッション・サイズが重要な考慮事項になります。メモリー使用量は、アプリケーションがクラスタ化されるかどうかにかかわらず影響要因となりますが、クラスタ化アプリケーションの場合はさらに、セッションが大規模な場合のCPU使用率とネットワーク負荷の増加についても考慮する必要があります。メモリー内セッションを使用する非クラスタ化アプリケーションではセッション状態のシリアライズ/デシリアライズは必要ありませんが、クラスタ化アプリケーションではセッション状態の更新時に毎回シリアライズ/デシリアライズを実行する必要があります。セッション状態のシリアライズと、その後のネットワークを介した転送は、アプリケーションのパフォーマンスに影響を及ぼす重要な要因になります。このような理由などから、サーバーでは、通常、セッション・サイズを2、3KB以下に制限する必要があります。
Coherence*Webのトラディショナル・セッション・モデルとモノリシック・セッション・モデルでは制限要因が共通していますが、スプリット・セッション・モデルは大規模なHTTPセッションを効率よくサポートするように明示的に設計されています。単一のクラスタ化されたキャッシュ・エントリを使用して小さいセッション属性のすべてを格納することによって、セッションまたはその比較的小さい属性に対するアクセスや更新時にネットワーク通信量が最小化されます。各属性を個別にデシリアライズすることによって、CPU使用率も最小化されます。Coherence*Webは、比較的大きいセッション属性を独立したクラスタ化キャッシュ・エントリに分離します。そのため、アプリケーションでそのような大きいセッション属性に関連するコストが発生するのは、対象の属性へのアクセスまたは属性の更新が実際に実行されたときのみに限定されます。また、Coherence*WebではCoherenceのデータ管理機能が活用されるため、ニア・キャッシング、NIOバッファ・キャッシング、ディスクベースのオーバーフローなど、基礎となるすべての機能をセッション属性管理に利用できます。
図4-5は、セッション・サイズに応じたパフォーマンスを示しています。各セッションは、10個の10文字の文字列と0 - 4個の10,000文字の文字列で構成されています。各HTTPリクエストでは、小さい属性1つと、大きい属性1つ(セッション内に大きい属性が存在する場合)が読み取られ、リクエストの50%でこれらの属性が更新されます。2つのサーバーから成るクラスタで、テストが実行されました。トラディショナル・モデルとモノリシック・モデルのパフォーマンスはだいたい同じである点に注目してください。文字列のシリアライズ/デシリアライズでは最小限のCPUリソースしか消費されないため、実際に使用された属性のみのデシリアライズによるパフォーマンスの向上はほとんどありません。スプリット・モデルによるパフォーマンスの向上率は、セッション・サイズが1MB(大きな文字列100個)に達するまでに37:1を超えます。特筆すべき点として、クラスタ化環境では、基本的なデータにしかアクセスしないアプリケーション・リクエストについては、スケーラビリティとパフォーマンスの向上の可能性があります。これは、セッションを妥当なサイズに抑える必要がある理由の1つとなっています。
もう1つの最適化方法は、セッション属性クラスでの一時データ・メンバーの使用です。Javaのシリアライズ・ルーチンは、一時フィールドを無視するため、セッション属性がクラスタ化されているか、単一のクラスタ・メンバーに分離されているかを制御するための非常に便利な手段になります。これは、データが他のデータ・ソースから遅延ロードされる(したがって、サーバーのフェイルオーバー・プロセスでは再計算される)場合や、絶対的な信頼性を必要としないシナリオで役立ちます。セッション状態の一部が失われてもアプリケーションに支障がなく、ユーザーへの影響がゼロ(または許容できる最小限)であれば、パフォーマンス上のメリットを考慮する価値があります。同様に、スケールの大きいアプリケーションでは、セッションの喪失をセッションのタイムアウトとして処理し、ユーザーにアプリケーションへの再ログインを要求することもめずらしくありません(これには、アプリケーション・セッションの状態に関するユーザーの期待を適切に設定するという暗黙的なメリットがあります)。
スティッキー・ロード・バランシングは重要な役割を果たします。なぜなら、セッションの状態はクラスタ全体でグローバルに参照可能なわけではないためです。スケールの大きいクラスタでは、ユーザー・リクエストは、通常、一連のステートレス・ロード・バランサを介してアプリケーション層に入り、これらのバランサによって、Microsoft IISやApache HTTP Serverなどの一連のスティッキー・ロード・バランサに(ある程度ランダムに)再分配されます。これらのスティッキー・ロード・バランサは、リクエストのHTTPヘッダーを解析して、そのリクエストを処理しているサーバー・インスタンスを(セッションCookieに指定されたサーバーIDに基づいて)判別するという、より集中的な計算を必要とする処理を行います。なんらかの理由でリクエストが誤ってルーティングされた場合、セッションの整合性が失われます。たとえば、一部のロード・バランサでは、大量(64KB超など)のPOSTデータを含むリクエストのHTTPヘッダーが解析されず、このようなリクエストが適切なサーバー・インスタンスにルーティングされないことがあります。ルーティング障害のその他の原因として、セッションCookie内のサーバーIDの破損や形式の誤りなどがあります。これらの問題のほとんどは、ロード・バランサを適切に選択するとともに、可能な場合はアプリケーションの設計で耐久力を組み込むこと(たとえば、大きなPOSTリクエストではいずれもセッション状態に対するアクセスや変更を行わないなど)によって対処できます。
スティッキー・ロード・バランシングはCoherence*Webのパフォーマンスを促進しますが、必須ではありません。Coherence*WebはCoherenceデータ管理プラットフォームを基盤としているため、すべてのセッション・データがクラスタ全体でグローバルに参照可能です。Coherence*Webの標準的なデプロイメントでは、セッション・データがニア・キャッシュ・トポロジに配置されます。このトポロジでは、パーティション化されたキャッシュの使用により、膨大なデータがスケーラビリティとフォルト・トレランスのある方法で管理されるとともに、各アプリケーション・サーバーJVMのローカル・キャッシュによって、よく使用されるセッション状態へのアクセスが迅速化されます。スティッキー・ロード・バランサはCoherence*Web使用時に必須というわけではありませんが、このバランサの使用によって2つの重要なメリットが得られます。ニア・キャッシュ・テクノロジが使用されるため、ユーザー・リクエストが常に同じサーバーにルーティングされるのであれば、セッション属性への読取りアクセスが迅速化されます。なぜなら、ローカル・キャッシュを使用することで、コストのかかるセッション属性のデシリアライズとネットワーク転送が不要になるためです。また、スティッキー・ロード・バランシングによって、Coherenceで並行性をローカルで管理できるようになります。ユーザー・リクエストが別のサーバーにリバランスされるときにのみ、セッション・ロックが転送されます。
この項には次のトピックが含まれます:
Coherence*Webを使用すると、同じWebコンテナまたは別々のWebコンテナにデプロイした複数のWebアプリケーションでセッション・データを共有できます。これを行うには、セッションCookieコンテキスト・パラメータを正しく構成して、セッション属性に保存したオブジェクトのクラスを各Webアプリケーションで使用できるようにする必要があります。
Cookieを使用してセッションIDを保存している場合(つまり、URLリライティングを使用していない場合)、セッションCookieパスには、セッション・データを共有するすべてのWebアプリケーションの共通コンテキスト・パスを設定する必要があります。たとえば、/web/HRPortal
と/web/InWeb
のコンテキスト・パスで登録した2つのWebアプリケーション間でセッション・データを共有する場合は、coherence-session-cookie-path
パラメータを/web
に設定する必要があります。一方、/HRPortal
と/InWeb
のコンテキスト・パスで2つのWebアプリケーションを登録している場合は、coherence-session-cookie-path
パラメータをスラッシュ(/
)に設定する必要があります。
セッション・データの共有を必要とする複数のWebアプリケーションのそれぞれを、互いに別のマシンで実行している別のWebコンテナにデプロイしている場合に、これらのマシンに共通のロード・バランシングを適用していないと、セッションCookieドメインをこれらのマシンで共有しているドメインに構成することも必要です。たとえば、server1.mydomain.com
とserver2.mydomain.com
で実行している2つのWebアプリケーション間でセッション・データを共有する場合は、coherence-session-cookie-domain
コンテキスト・パラメータを.mydomain.comに設定する必要があります。
共有セッションに保存したオブジェクトを適切にシリアライズまたはデシリアライズするには、セッション属性に保存したすべてのオブジェクトのクラスを、セッション・データを共有するWebアプリケーションで使用できるようにする必要があります。
注意:
EARクラスタ・ノードのスコープ設定またはアプリケーション・サーバーJVMクラスタのスコープ設定を採用し、かつ個々のWebアプリケーション間でセッション・データを共有しない高度な用途は、「Webアプリケーション間でのセッション・データ共有の禁止」を参照してください。
この項には次のトピックが含まれます:
同じCoherenceクラスタに属する複数のJava EEアプリケーションであっても、HTTPセッション・データを共有しないようにすることが必要な場合があります。たとえば、Enterprise JavaBeans (EJB)層でキャッシュ・データを共有する2つのアプリケーションHRPortal
およびInWeb
があり、それぞれで使用するセッション・データは互いに別であるとします。この2つのアプリケーションにとって、1つのCoherenceクラスタに属していることは必要ですが、セッション・データについては同じクラスタ化サービスを使用しないようにする必要があります。これを実行する方法の1つは、ApplicationScopeController
インタフェースを使用して、アプリケーションの属性のスコープを定義することです。「セッション属性スコープ設定」でこの手法について説明します。もう1つの方法は、アプリケーションごとに固有のセッション・キャッシュ・サービス名を指定することです。
アプリケーションごとに固有のセッション・キャッシュ・サービス名を指定する手順は、次のとおりです。
例4-2 アプリケーション間でセッション・データを共有しないようにするための構成
<replicated-scheme> <scheme-name>default-replicated</scheme-name><service-name>ReplicatedSessionsMisc</service-name> // rename this to ReplicatedSessionsMiscHRP
<backing-map-scheme> <class-scheme> <scheme-ref>default-backing-map</scheme-ref> </class-scheme> </backing-map-scheme> </replicated-scheme> <distributed-scheme> <scheme-name>session-distributed</scheme-name><service-name>DistributedSessions</service-name> // rename this to DistributedSessionsHRP
<lease-granularity>member</lease-granularity> <backing-map-scheme> <class-scheme> <scheme-ref>default-backing-map</scheme-ref> </class-scheme> </backing-map-scheme> </distributed-scheme> <distributed-scheme> <scheme-name>session-certificate</scheme-name><service-name>DistributedSessions</service-name> // rename this to DistributedSessionsHRP
<lease-granularity>member</lease-granularity> <backing-map-scheme> <local-scheme> <scheme-ref>session-certificate-autoexpiring</scheme-ref> </local-scheme> </backing-map-scheme> </distributed-scheme>
Coherence*Webで実行している複数のアプリケーションを操作する場合、それらに複数の異なるキャッシュ構成を設定できます。この場合、キャッシュ・サーバーのキャッシュ構成には、記憶域を有効化して実行しているか記憶域を無効化して実行しているかに関係なく、これらのキャッシュ構成の和を含める必要があります。これにより、同じキャッシュ・クラスタでそれらのアプリケーションをサポートできます。
Cookieを使用してセッションIDを保存している場合は、あるアプリケーションで作成したセッションCookieが別のアプリケーションに伝播されないようにする必要があります。これを行うには、各アプリケーションのweb.xml
ファイルで、そのアプリケーションのセッションCookieのドメインとパスを設定する必要があります。Cookieが伝播されないようにするには、2つのアプリケーションで同じコンテキスト・パスを共有しないようにします。
たとえば、2つのWebアプリケーションをそれぞれ/web/HRPortal
と/web/InWeb
のコンテキスト・パスで登録しているとします。これらのWebアプリケーションがCookieでセッション・データを共有しないようにするには、一方のアプリケーションのCookieパスを/web/HRPortal
に設定し、もう一方のアプリケーションのCookieパスを/web/InWeb
に設定します。
それぞれ別のマシンで実行している異なるWebコンテナに複数のアプリケーションをデプロイした場合、それらが同じドメインにならないようにCookieドメインを構成できます。
たとえば、2つのWebアプリケーションをserver1.mydomain.com
とserver2.mydomain.com
で実行しているとします。それらの間でセッションCookieを共有しないようにするには、一方のアプリケーションのCookieドメインをserver1.mydomain.com
に設定し、もう一方のアプリケーションのCookieドメインをserver2.mydomain.com
に設定します。
複数のWebアプリケーションでセッションを共有している場合は、セッション属性をグローバルに認識できるように(すべてのWebアプリケーションからアクセスして変更できるようにする)、または逆に個々のWebアプリケーションのみで認識できるように(他のアプリケーションのインスタンスからはアクセスできないようにする)、個々のセッション属性のスコープをアプリケーションで設定することが必要になる場面が数多くあります。
Coherence*Webでは、この動作はAttributeScopeController
インタフェースを使用して制御できます。複数のアプリケーションでセッションを共有する場合に、このオプション・インタフェースを使用して属性を選択的にスコープ設定できます。これにより、他のアプリケーションの属性を誤って読取り、更新、削除することなく、複数のアプリケーションでアプリケーション・スコープ状態について同じ属性名を使用できます。セッションでは、アプリケーション別スコープを設定した情報のほか、セッションを共有するすべてのアプリケーションで読取り、更新、および削除できるグローバルな(スコープ設定していない)情報を保持することもできます。
AttributeScopeController
インタフェースの2つの実装(ApplicationScopeController
とGlobalScopeController
)が使用できます。GlobalScopeController
の実装は属性のスコープを設定しませんが、ApplicationScopeController
では、すべての属性名の先頭にアプリケーションの名前を追加することによって、すべての属性のスコープをアプリケーションに設定します。
coherence-application-name
コンテキスト・パラメータを使用して、アプリケーション(およびアプリケーションが記述されたWebモジュール)の名前を指定します。ApplicationScopeController
インタフェースでは、アプリケーションの名前を使用して属性のスコープを設定します。このパラメータを構成しない場合、Coherence*Webでは、かわりにクラス・ローダーの名前が使用されます。詳細は、表2-1のcoherence-application-name
の説明を参照してください。
注意:
構成済のAttributeScopeController
実装は、作成後、属性名の修飾に使用できるWebアプリケーションの名前を使用して初期化されます。coherence-application-name
コンテキスト・パラメータを使用して、Webアプリケーションの名前を構成します。
この項には次のトピックが含まれます:
Coherence*Webでは、複数のアプリケーションが同じセッション・オブジェクトを共有できます。これを行うには、セッション属性がすべてのアプリケーションから参照可能である必要があります。また、WebLogic Serverで処理するURLにおいてCookieを受信できるURLを指定する必要があります。
アプリケーションでセッション属性の共有および変更ができるようにするには、web.xml
ファイルのcoherence-scopecontroller-class
コンテキスト・パラメータの値としてGlobalScopeController
(com.tangosol.coherence.servlet.AbstractHttpSessionCollection$GlobalScopeController
)インタフェースを参照します。GlobalScopeController
は、com.tangosol.coherence.servlet.HttpSessionCollection$AttributeScopeController
インタフェースの実装であり、これによって個別のセッション属性をグローバルに参照できます。
例4-3は、web.xml
ファイルで指定されたGlobalScopeController
インタフェースを示しています。
例4-3 web.xmlで指定されたGlobalScopeController
<?xml version="1.0" encoding="UTF-8"?> <web-app> ... <context-param> <param-name>coherence-scopecontroller-class</param-name> <param-value>com.tangosol.coherence.servlet. AbstractHttpSessionCollection$GlobalScopeController</param-value> </context-param> ... </web-app>
アプリケーションには、アプリケーション・サーバー・スコープ、EARスコープ、またはWARスコープを設定できます。この項では、これらの考慮事項について説明します。これらの各オプションに対するXML構成の詳細は、「Coherence*Webの記憶域モードの構成」を参照してください。
この項には次のトピックが含まれます:
この構成では、Coherence*Webを使用するコンテナにデプロイしたすべてのアプリケーションが1つのCoherenceノードに属します。この構成では、クラスタに作成されるCoherenceノードの数が最小となります(WebコンテナJVMごとに1つ)。また、Coherenceライブラリ(coherence.jar
)がコンテナのクラスパスにデプロイされるので、JVMにロードされるCoherenceクラスのコピーは1つのみです。これによって、リソースの使用が最小限に抑えられます。その一方で、すべてのアプリケーションで1つのクラスタ・ノードを使用するので、いずれかのアプリケーションに不具合があるとすべてのアプリケーションが影響を受けます。
図4-6に、クラスタ・ノード(アプリケーション・サーバー・インスタンス)が2つのアプリケーション・サーバー・スコープ設定クラスタを示します。Coherence*Webは各インスタンスのクラスパスにデプロイされているため、各インスタンスはCoherenceノードと見なすことができます。各ノードには2つのEARファイルが含まれ、それぞれのEARファイルには2つのWARファイルが含まれます。各インスタンスで実行されるすべてのアプリケーションは、同じCoherenceライブラリおよびクラスを共有します。
WebLogic Serverでは、デフォルトですべてのCoherence*Web対応アプリケーションがアプリケーション・サーバー・スコープを持ちます。WebLogic Serverのアプリケーション・サーバー・スコープ設定クラスタ・ノードのXML構成要件の詳細は、「Coherence*Webの記憶域モードの構成」を参照してください。
注意:
WebLogic Server以外のプラットフォームでは、アプリケーション・サーバー・スコープ設定クラスタ構成の使用は、慎重に検討する必要があります。アプリケーション間の相互作用が未知または予測不能な環境では使用しないでください。
このような環境の例として、規則や命名基準の調整や実施が不十分な状態で互いに無関係に作成したアプリケーションを、複数のアプリケーション・チームでデプロイしている状況が考えられます。このような構成では、すべてのアプリケーションが同じクラスタに属することから、キャッシュやサービスなどの他の構成設定と名前空間どうしで競合が発生する可能性がきわめて高く、予期しない結果を生じる恐れがあります。
このような理由から、WebLogic Server以外のプラットフォームでは、EARスコープ設定クラスタ・ノードによる構成およびWARスコープ設定クラスタ・ノードによる構成を使用することがベスト・プラクティスです。どのデプロイメント・トポロジを選択したらよいか不明な場合や、この注意が使用するデプロイメントに該当している場合は、アプリケーション・サーバー・スコープ設定クラスタ・ノードによる構成は選択しないでください。
この構成では、EARファイルごとにデプロイしたすべてのアプリケーションが1つのCoherenceノードに属します。この構成では、Coherence*Webを使用するデプロイ済EARファイルごとに1つのCoherenceノードが作成されます。Coherenceライブラリ(coherence.jar
)がアプリケーションのクラスパスにデプロイされるので、ロードされるCoherenceクラスのコピーはEARファイルごとに1つです。EARファイル内のすべてのWebアプリケーションが同じクラスタ・ノードを使用するので、いずれかのWebアプリケーションに不具合があるとEARファイル内のすべてのWebアプリケーションが影響を受けます。
図4-7は、4つのEARスコープ設定クラスタ・ノードを示します。Coherence*Webは各EARファイルにデプロイされているため、各EARファイルがクラスタ・ノードとなります。各EARファイル内で実行されるすべてのアプリケーションは、同じCoherenceライブラリおよびクラスへのアクセス権を持ちます。
EARスコープ設定クラスタ・ノードでは、アプリケーション・サーバー・クラスパスを変更する必要がないので、デプロイメントに手間がかかりません。このオプションは、1つのアプリケーション・サーバーにデプロイするEARファイルを1つのみとする場合にも適しています。
注意:
WebLogic Serverプラットフォームで実行しているアプリケーションでは、EARスコープ設定クラスタ・ノードを使用しないでください。
この構成では、デプロイしたWebアプリケーションごとに専用のCoherenceノードがあります。この構成でクラスタに作成されるCoherenceノードの数は最多となります(Coherence*Webを使用するデプロイ先WARファイルごとに1つずつ)。Coherenceライブラリ(coherence.jar
)がWebアプリケーションのクラスパスにデプロイされるので、ロードされるCoherenceクラスのコピーの数はデプロイ先WARファイルと同じ数になります。その結果、3種類の構成オプションの中で最もリソース使用率が高くなります。ただし、デプロイしたWebアプリケーションごとに専用のクラスタ・ノードがあるので、いずれかのWebアプリケーションに不具合があっても、他のWebアプリケーションは分離されているので影響を受けません。
WARスコープ設定クラスタ・ノードでは、アプリケーション・サーバー・クラスパスを変更する必要がないので、デプロイメントに手間がかかりません。このオプションは、1つのアプリケーション・サーバーにデプロイするWARファイルを1つのみとする場合にも適しています。
図4-8に、アプリケーション・サーバー内のWARファイルの2つの異なる構成を示します。各WARファイルにはCoherence*Web(およびCoherence)のコピーが含まれているため、これはクラスタ・ノードと見なすことができます。
注意:
WebLogic Serverプラットフォームで実行しているアプリケーションでは、WARスコープ設定クラスタ・ノードを使用しないでください。
Oracle Coherenceには、HTTPセッションへの同時アクセスを実現する異なる構成オプションが用意されています。
この項には次のトピックが含まれます:
HTTPセッションへの同時アクセスを実現する次の構成オプションは、次のとおりです。
オプティミスティック・ロック: 単一のメンバーまたは複数のメンバーにある複数のスレッドからセッションに同時アクセスできます。ただし、セッションを同時に変更できません。
最後の書込みを優先するロック: オプティミスティック・ロックの一種です。これにより、単一のメンバーまたは複数のメンバーにある複数のスレッドからセッションに同時アクセスできます。この場合、最後の書込みが保存されます。これはデフォルトのロック・モードです。
メンバー・ロック: 同じメンバーにある複数のスレッドからセッションに同時にアクセスし、同時にセッションを変更できます。別々のメンバーにあるスレッドからは同時にアクセスできません。
アプリケーション・ロック: 同じWebアプリケーション・インスタンスにある複数のスレッドから同時にセッションにアクセスし、同時にセッションを変更できます。別々のWebアプリケーション・インスタンスにあるスレッドからは同時にアクセスできません。
スレッド・ロック: 単一のメンバーにある複数のスレッドからセッションに同時にアクセスできず、同時にセッションを変更することもできません。
注意:
一般的に、同じクラスタに属するWebアプリケーションは、同じロック・モードおよびスティッキー・セッション最適化設定を使用する必要があります。構成に一貫性がないと、デッドロックが発生することがあります。
Webアプリケーションが使用するセッション・ロッキング・モードを指定するには、coherence-session-locking-mode
コンテキスト・パラメータを設定します。表4-1は、コンテキスト・パラメータの値と、それによって指定されるセッション・ロッキング・モードを示しています。coherence-session-locking-mode
コンテキスト・パラメータの詳細は、次の項と、「Coherence*Webコンテキスト・パラメータ」を参照してください。
表4-1 coherence-session-locking-modeコンテキスト・パラメータ値の一覧
ロック・モード | coherence-session-locking-modeの値 |
---|---|
オプティミスティック・ロック |
|
最後の書込みを優先するロック |
|
メンバー・ロック |
|
アプリケーション・ロック |
|
スレッド・ロック |
|
オプティミスティック・ロック・モードを使用すると、1つ以上のメンバーにある複数のWebコンテナ・スレッドから1つの同じセッションに同時にアクセスできます。この設定では明示的なロックは使用されず、セッションを変更するHTTPリクエストの完了後、楽観的なアプローチで同時更新を検出して防止します。ConcurrentModificationException
例外のスローはセッションがキャッシュにフラッシュされたときに行われ、これはサーブレット・リクエストが処理を終了した後になります。例外を表示するには、コンテナの起動スクリプトでweblogic.debug.DebugHttpSessions
システム・プロパティをtrue
に設定します(例: -Dweblogic.debug.DebugHttpSessions=true
)。
オプティミスティック・ロック・モードは、coherence-session-locking-mode
パラメータをoptimistic
に設定することにより構成できます。
Coherence*Webは、デフォルトで最後の書込みを優先するロックを使用するように構成されています。最後の書込みを優先するロックは、オプティミスティック・ロック・モードの一種です。これを使用すると、1つ以上のメンバーにある複数のWebコンテナ・スレッドから同じセッションに同時にアクセスできます。この設定では明示的なロックは使用されず、セッションを変更するHTTPリクエストの完了時に同時更新は防止されません。かわりに、最後の書込み、つまり最終変更によってセッションが変更されます。
最後の書き込みを優先するロック・モードは、coherence-session-locking-mode
パラメータをnone
に設定することにより構成できます。この値により、セッションに対して最後の更新が適用される同時変更ができます。
メンバー・ロック・モードを使用すると、同じクラスタ・ノードにある複数のWebコンテナ・スレッドから同じセッションに同時にアクセスして変更できますが、別々のメンバーにあるスレッドからは同時にアクセスできません。これは、HTTPセッションを取得したときに、そのセッションのメンバー・レベルのロックを取得することによって実現されます。ロックはHTTPリクエストの完了時に解放されます。『Oracle Coherenceでのアプリケーションの開発』の<lease-granularityを参照してください。
メンバー・ロック・モードは、coherence-session-locking-mode
パラメータをmember
に設定することにより構成できます。
アプリケーション・ロック・モードでは、1つのWebアプリケーション・インスタンスにある一連のスレッドからのみセッションに同時にアクセスし、変更できます。この動作は、セッションの取得時点でHTTPセッションに対するメンバー・レベルのロックとアプリケーション・レベルのロックの両方を取得して、HTTPリクエストの完了時点で両方のロックを解放することによって実現します。『Oracle Coherenceでのアプリケーションの開発』の<lease-granularity
を参照してください。
アプリケーション・ロック・モードは、coherence-session-locking-mode
パラメータをapp
に設定することにより構成できます。
スレッド・ロック・モードでは、一度に1つのメンバーにある1つのスレッドからのみセッションにアクセスし、変更できます。この動作は、セッションの取得時点でHTTPセッションに対するメンバー・レベルのロック、アプリケーション・レベルのロックおよびスレッド・レベルのロックを取得して、リクエストの完了時点でそれらの3つすべてのロックを解放することによって実現します。『Oracle Coherenceでのアプリケーションの開発』のdistributed-schemeに関する項の<lease-granularity
を参照してください。
スレッド・ロック・モードは、coherence-session-locking-mode
パラメータをthread
に設定することにより構成できます。
HTTPセッション・アクセスに対してメンバー、アプリケーションまたはスレッドのロックを有効にすることは、セッションへのアクセスを必要とする各HTTPリクエストに対してCoherence*Webがクラスタ規模のロックを取得することを意味します。デフォルトでは、ロックされたセッション(別のメンバーにあるスレッドでロックされたセッション)にアクセスしようとするスレッドは、ロックが取得できるまでアクセスをブロックします。ロック取得のタイムアウトを有効にする場合は、これをcoherence-session-get-lock-timeout
コンテキスト・パラメータで構成します。次に例を示します。
... <context-param> <param-name>coherence-session-get-lock-timeout</param-name> <param-value>30</param-value> </context-param> ...
多くのWebアプリケーションには、このような厳しい同時処理要件がありません。このようなアプリケーションの場合は、オプティミスティック・ロック・モードを使用することによって、次のようなメリットが得られます。
HTTPリクエストのたびにクラスタ規模のロックを取得して解放することで発生するオーバーヘッドを排除できます。
障害が発生したメンバーや応答しないメンバーからアクティブなメンバーにリクエストをルーティングして負荷分散できます。クラスタ規模でセッションに適用されているロックの解放を、応答しなくなったメンバーに要求する必要がありません。
Coherence*Webは、メンバーがセッションに対してクラスタ・ロックを取得できない場合に実行される診断起動サービスを提供します。このサービスを有効にするかどうかはcoherence-session-log-threads-holding-lock
コンテキスト・パラメータで設定します。このコンテキスト・パラメータをtrue
(デフォルト)に設定した場合、この起動サービスによって、セッションの所有権を持つメンバーが、現在ロックを保持しているスレッドのスタック・トレースを記録するようになります。
coherence-session-log-threads-holding-lock
コンテキスト・パラメータは、coherence-sticky-sessions
コンテキスト・パラメータがtrue
に設定されている場合にのみ使用可能です。このような要件があるのは、スティッキー・セッションの最適化が有効でないかぎり、Coherence Webが各セッション・アクセス・リクエストごとにクラスタ規模のロックを取得するためです。スティッキー・セッションの最適化を有効にすることにより、頻繁なロックの保持およびそれに続く多数のログ・ファイルの生成を回避できます。
すべてのCoherence*Webメッセージと同様に、Coherence logging-config
操作構成要素によって、メッセージの記録方法が制御されます。『Oracle Coherenceでのアプリケーションの開発』のlogging-configに関する項
を参照してください。
スティッキー・ロード・バランサの対象となっているWebアプリケーションの要件としてメンバー・ロック、アプリケーション・ロック、またはスレッド・ロックがある場合は、HTTPセッションへのアクセスに必要なクラスタ規模のロックの取得をCoherence*Webで最適化できます。その名が示すとおり、スティッキー・ロード・バランサは、セッションに対する各リクエストを、前回そのセッションでリクエストの転送先として使用されたものと同じアプリケーション・サーバーJVMにルーティングしようとします。これは、そのセッションを作成したアプリケーション・サーバーJVMと同じものです。スティッキー・セッション最適化では、セッションに対するクラスタ規模のロックをそのセッションの有効期限が切れるまで、または解放するよう要求されるまで保持することによって、この動作を利用しています。なんらかの理由で、スティッキー・ロード・バランサが同じセッションに対するリクエストを別のアプリケーション・サーバーJVMに送信した場合は、そのJVMから該当セッションのロックを保持しているJVMに対して、できるだけ早くロックを解放するよう要求します。詳細は、表C-2のSessionOwnership
エントリを参照してください。
スティッキー・セッション最適化は、coherence-sticky-sessions
コンテキスト・パラメータをtrue
に設定すると有効になります。この設定では、メンバー、アプリケーションまたはスレッドのロックが有効になっている必要があります。
サポートされている主なデプロイメント・トポロジについて、次の項で説明します。
インプロセス・トポロジは、本番環境での使用にはお薦めできません。主に、開発用とテスト用としてサポートされています。このトポロジは、アプリケーション・サーバーを使用してセッション・データをプロセス内で保存することで、容易に起動して、スモーク・テスト、開発、およびテスト用として高速で実行できます。このトポロジでは、ローカル記憶域が有効化(coherence.distributed.localstorage=true
)されます。
図4-9に、インプロセス・トポロジを示します。すべてのアプリケーション・サーバーが同じセッション・データ・キャッシュと通信します。
アウトオブプロセス・デプロイメント・トポロジでは、アプリケーション・サーバー(アプリケーション・サーバー層)をキャッシュ・クライアントとして構成し(coherence.distributed.localstorage=false
)、クラスタ化データを物理的に保存および管理してキャッシュ・サーバーとして動作する専用のJVMを配置します。
このアプローチには次のようなメリットがあります。
セッション・データ記憶域の負荷を、アプリケーション・サーバー層からキャッシュ・サーバー層に移管できます。これによって、ヒープ使用量やガベージ・コレクション時間などを低減できます。
アプリケーションとキャッシュ・サーバー層は、独立してスケールできます。アプリケーションの処理能力が不足している場合は、起動するアプリケーション・サーバーの数を増やすだけですみます。セッション記憶域の容量が不足している場合は、起動するキャッシュ・サーバーの数を増やすだけです。
アウトオブプロセス・トポロジは、その柔軟性によって、Oracle Coherenceのデフォルトの推奨トポロジになっています。図4-10に、アウトオブプロセス・トポロジを示します。アプリケーション層の各サーバーは、独自のニア・キャッシュを保持します。これらのニア・キャッシュは、別のキャッシュ・サーバー層で実行されるセッション・データ・キャッシュと通信します。
アプリケーションをインプロセス・トポロジからアウトオブプロセス・トポロジに容易に移行できます。このためには、アプリケーション・サーバーに加えてキャッシュ・サーバーを実行する必要があります。キャッシュ・サーバーを記憶域有効モードで起動し、これがアプリケーション・サーバーで使用しているものと同じセッションおよびキャッシュ構成ファイル(default-session-cache-config.xml
)を参照するようにします。記憶域無効モードでアプリケーション・サーバーを起動します。「アウトオブプロセス・トポロジへの移行」を参照してください。
Coherence*Extendは、クラスタの外部で実行されるExtendクライアント(またはプロキシ)と、1台以上のキャッシュ・サーバーでホストされているクラスタ内で実行される拡張プロキシ・サービスの2つの基本コンポーネントで構成されます。Coherence*Extendによるアウトオブプロセス・トポロジは、アウトオブプロセス・トポロジに似ていますが、アプリケーション・サーバー層とキャッシュ・サーバー層との通信をCoherence*Extend経由(TCP/IP)で行う点が異なります。「Coherence*ExtendによるCoherence*Webの構成」を参照してください。
このアプローチには、アウトオブプロセス・トポロジと同じメリットがあるほか、アプリケーション・サーバーとキャッシュ・サーバーのデプロイメントをセグメントに分割する機能もあります。この特性は、UDPをサポートしていないネットワーク上にアプリケーション・サーバーが存在する環境に最適です。TCPを使用してクラスタにアプリケーション・サーバーを接続した上で、独立した専用のネットワークにキャッシュ・サーバーを配置できます。
図4-11に、Coherence*Extendによるアウトオブプロセス・トポロジを示します。アプリケーション・サーバー層のサーバー内のニア・キャッシュは、拡張プロキシを使用して、キャッシュ・サーバー層のセッション・データ・キャッシュと通信します。
この項には次のトピックが含まれます:
Coherence*Webのデプロイメント・オプションの1つに、Coherence*Extendを使用して、WebコンテナのJVMをTCP/IP経由でクラスタに接続する方法があります。この構成は、次のいずれかの状況が該当する場合に検討してください。
Web層JVMがDMZにあるのに、Coherenceクラスタがファイアウォールの内側にあります。
Web層がUDPをサポートしていない環境に作成されています。
Web層JVMで、ガベージ・コレクション(GC)が長時間または頻繁に一時停止します。
Web層JVMが頻繁に再起動します。
これらのデプロイメントの参加者には、次の3種類があります。
Web層JVMは、このトポロジではExtendクライアントとして機能します。クラスタのメンバーにはならず、クラスタ内のプロキシ・ノードに接続します。クラスタへのリクエストの発行は、そのプロキシ・ノードが代行します。
プロキシJVMは、クラスタ内の記憶域が無効なメンバー(ノード)として、ExtendクライアントからのTCP/IP接続を受け入れ、管理します。クライアントからのリクエストはクラスタに送信され、応答はTCP/IP接続を通じて返送されます。
記憶域JVMは、実際のセッション・データをメモリーに格納する際に使用されます。
Coherence*Webを構成してCoherence*Extendを使用する手順は次のとおりです。
オプティミスティック・ロック・モードを使用するようにCoherence*Webを構成します。「オプティミスティック・ロック」を参照してください。
プロキシJVMと記憶域JVMのキャッシュ構成ファイルを構成します。「プロキシJVMと記憶域JVMのキャッシュの構成」を参照してください。
1つ以上のプロキシJVMをポイントするようにWeb層キャッシュ構成ファイルを変更します。「Web層JVMのキャッシュの構成」を参照してください。
セッション・キャッシュ構成ファイル(WEB-INF/classes/default-session-cache-config.xml
)は、Coherence*Extendを使用するCoherence*Webセッションのキャッシュ構成ファイルの例です。プロキシおよびサーバーJVMにはこのファイルを使用します。これには、同じファイルをプロキシJVMと記憶域JVMの両方に使用できるシステム・プロパティのオーバーライドが含まれます。
プロキシJVMで使用する場合は、表4-2に示すシステム・プロパティを指定する必要があります。
注意:
WebLogic Serverプラットフォームのアプリケーションを記述しており、カスタマイズしたセッション・キャッシュ構成ファイルを使用している場合は、この構成ファイルをデプロイメントのためのGARファイルにパッケージ化する必要があります。「カスタム・セッション・キャッシュ構成ファイルの使用方法」を参照してください。
GARファイルのパッケージ化要件の詳細は、『Oracle Coherenceの管理』のWebLogic Server用のCoherenceアプリケーションのパッケージ化に関する項および『Oracle WebLogic Server Oracle Coherenceアプリケーションの開発』のOracle WebLogic Server用のCoherenceアプリケーションの作成に関する項も参照してください。
表4-2 プロキシJVM用のシステム・プロパティ値
システム・プロパティ名 | 値 |
---|---|
|
|
|
|
|
プロキシがバインドされるNICのホスト名またはIPアドレス。 |
|
プロキシがバインドされるポートの一意のポート番号。 |
キャッシュ・サーバーで使用する場合は、表4-3に示すシステム・プロパティを指定します。
表4-3 記憶域JVM用のシステム・プロパティ値
システム・プロパティ名 | 値 |
---|---|
|
|
|
|
遅延取得は、サーブレットまたはフィルタがコールされる場合に、セッションの不要な取得を防ぐために使用できます。
デフォルトでは、WebInstallerで設定されたWebアプリケーションは、サーブレットまたはフィルタがコールされるたびにセッションを取得します。サーブレットまたはフィルタで実際にセッションが必要であるかどうかに関係なく、セッションは取得されます。これにより、セッションが不要なサーブレットやフィルタを多数実行すると、時間がかかる場合や処理に負担がかかる場合があります。
この動作を防止するには、web.xml
ファイルのcoherence-session-lazy-access
コンテキスト・パラメータをtrue
に設定して遅延取得を有効にします。サーブレットやフィルタがアクセスを試みたときにのみ、セッションは取得されます。
HttpSessionCollection.SessionDistributionController
インタフェースを使用して、Webアプリケーション内のHTTPセッションと属性をオーバーライドできます。
この項には次のトピックが含まれます:
coherence-distributioncontroller-class
コンテキスト・パラメータを設定してデフォルトのディストリビューションをオーバーライドします(「セッション・ディストリビューション・コントローラの実装の登録」を参照)。コンテキスト・パラメータの値は、SessionDistributionController
インタフェースの実装を示します。
SessionDistributionController
インタフェースの実装では、セッションまたは属性を次のいずれかの方法で特定できます。
distributed: 分散されたセッションまたは属性は、Coherenceデータ・グリッド内に格納されるため、他のサーバーのJVMからアクセスできます。すべてのセッション(およびその属性)が分散管理されます。これがデフォルトの動作で、SessionDistributionController
インタフェースのcom.tangosol.coherence.servlet.AbstractHttpSessionCollection$DistributedController
実装により指定されます。
local: ローカルのセッションまたは属性は、それらの作成元サーバーのヒープに格納されるため、そのサーバーからのみアクセスできます。com.tangosol.coherence.servlet.AbstractHttpSessionCollection$LocalController
クラスによりこの動作が指定されます。これは本番環境にはお薦めしませんが、ローカルのみの実装と完全な分散実装でのスケーラブル・パフォーマンスの違いをテストする場合に役立つことがあります。
hybrid: これは、すべてのセッションおよびシリアライズ可能な属性が分散管理されるdistributedに似ています。ただし、distributedとは異なり、Serializable
インタフェースを実装していないセッション属性は、localのままとなります。com.tangosol.coherence.servlet.AbstractHttpSessionCollection$HybridController
クラスによりこの動作が指定されます。
セッションの存続期間中であればどの時点でも、セッションまたはそのセッションの属性をlocalまたはdistributedから変更できます。ただし、一度分散されたセッションまたは属性は、localに戻すことはできません。
セッション・ディストリビューション・コントローラには、次のような使い方があります。
新しいセッションは、属性を追加するまで(たとえば、オンライン・ショッピング・カートに1つ目のアイテムを追加するまで)、localのままにできます。これは、セッションに意味のあるデータが含まれる場合のみ、セッションをフォルト・トレラントにする必要があるという発想です。
一部のWebフレームワークは、セッションの属性を使用してUIのレンダリング状態を格納します。一般に、このデータはシリアライズ不能なため、分散できません。セッション・ディストリビューション・コントローラを使用すると、これらの属性を「ローカル」として維持したまま、残りのセッションの属性を分散させることができます。
セッション・ディストリビューション・コントローラは、非分散システムを分散システムに変換する場合に役立ちます。特に、すべてのセッションとすべての属性の分散コストが検討事項となっている場合は有効です。
例4-4は、HttpSessionCollection.SessionDistributionController
インタフェースの実装例を示しています。この例では、セッションにショッピング・カートがアタッチされているかどうかがテストされます(アタッチされているセッションのみが分散されます)。次に、そのセッションに特定の属性が含まれているかどうかがテストされます。その属性が検出された場合、その属性は分散されません。
例4-4 セッション・ディストリビューション・コントローラの実装例
import com.tangosol.coherence.servlet.HttpSessionCollection; import com.tangosol.coherence.servlet.HttpSessionModel; /** * Sample implementation of SessionDistributionController */public class CustomSessionDistributionController
implements HttpSessionCollection.SessionDistributionController
{ public void init(HttpSessionCollection collection) { } /** * Only distribute sessions that have a shopping cart. * * @param model Coherence representation of the HTTP session * * @return true if the session should be distributed */ public boolean isSessionDistributed(HttpSessionModel model) { return model.getAttribute("shopping-cart") != null; } /** * If a session is "distributed", then distribute all attributes with the * exception of the "ui-rendering" attribute. * * @param model Coherence representation of the HTTP session * @param sName name of the attribute to check * * @return true if the attribute should be distributed */ public boolean isSessionAttributeDistributed(HttpSessionModel model, String sName) { return !"ui-rendering".equals(sName); } }
SessionDistributionController
の実装を記述したら、coherence-distributioncontroller-class
コンテキスト・パラメータを使用して、この実装をアプリケーションに登録できます。「Coherence*Webコンテキスト・パラメータ」を参照してください。
set
を実行せずにセッション属性を変更しない場合、coherence-enable-suspect-attributes
コンテキスト・パラメータをfalse
に設定する必要があります。これにより、メモリー使用率が改善され、ニア・キャッシュが最適化されます。coherence-preserve-attributes
パラメータをtrue
に設定することにより、これらをローカルに保存します。このパラメータでは、セッションのシリアライズ不可属性を取得するためにロード・バランサが必要です。クライアント(アプリケーション・サーバー)が失敗し、属性が失われた場合、アプリケーションをリカバリできる必要があることに注意してください。「Coherence*Webコンテキスト・パラメータ」を参照してください。この実装は、クラスタ・ノード間のTCMP通信やCoherence*Extendクライアントとプロキシ間のTCP通信の保護に使用できます。Coherenceでは、SSL 3.0プロトコルの次のバージョンのTransport Layer Security (TLS) 1.0プロトコルを使用できます。しかし、SSLの方が広く認識されている用語であるため、SSLという用語を使用します。
ここでは、Coherence環境でのSSLの使用方法の概要のみを説明します。『Oracle Coherenceの保護』のSSLを使用した通信の保護に関する項を参照してください。
SSLを使用したTCMP通信の保護
Coherenceクラスタは、TCMPでSSLを使用するように構成できます。Coherenceでは、一方向と双方向の両方の認証を使用できます。通常、双方向の認証を使用する方が一方向の認証よりも多く、クラスタ環境では一方向の認証は双方向の認証ほど使用されません。さらに、TCMPではpeer-to-peerプロトコルであることを認識する必要があります。peer-to-peerプロトコルは、通常、多くのクラスタ・ノードを相互に接続したままであることが想定される信頼できる環境で動作します。管理およびパフォーマンスに関してSSLが受ける可能性のある影響について、慎重に考慮する必要があります。
この構成では、ピア信頼に基づく双方向通信のSSL接続を可能にする事前定義済の即時利用可能なSSLソケット・プロバイダを使用することも、独自のSSLソケット・プロバイダを定義することもできます。
SSLを使用した拡張クライアント通信の保護
Extendクライアントと拡張プロキシの間の通信は、SSLを使用して保護できます。SSLには、クライアント側とクラスタ側の両方での構成が必要です。クラスタ側では、プロキシ・サービス用のSSLソケット・プロバイダを定義することにより、SSLをクラスタ側キャッシュ構成ファイルに構成します。SSLソケット・プロバイダは、すべてのプロキシ・サービス用にも、個々のプロキシ・サービス用にも定義できます。
クライアント側では、リモート・キャッシュ・スキーム用、また必要に応じてリモート起動スキーム用のSSLソケット・プロバイダを定義することにより、SSLをクライアント側キャッシュ構成ファイルに構成します。クラスタ側と同様に、SSLソケット・プロバイダは、すべてのリモート・サービス用にも、個々のリモート・サービス用にも定義できます。
default-session-cache-config.xml
ファイルを使用してセッション・キャッシュを構成します。web.xml
ファイル内のcoherence-cache-configuration-path
コンテキスト・パラメータを使用して、別のファイル名を指定できます。次のサンプルでCoherence*Webを構成し、セッション・キャッシュ構成でmy-default-session-cache-config-name.xml
ファイルを使用します。
... <context-param> <param-name>coherence-cache-configuration-path</param-name> <param-value>my-default-session-cache-config-name.xml</param-value> </context-param> ...
システムの重要な部分への影響を軽減するために、Coherenceでのロギングは優先度の低い専用のスレッドで実行されます。ロギングは事前構成されており、必要に応じてデフォルト設定を変更する必要があります。『Oracle Coherenceでのアプリケーションの開発』のロギングの構成に関する項を参照してください。
Coherence*Webのロギング・レベルは、コンテキスト・パラメータ/システム・プロパティcoherence-session-logger-level
を使用して設定することもできます。これは、JDKロギングを使用するかわりにCoherence*Webのロギング・レベルを設定する方法です。このパラメータの詳細は、「Coherence*Webコンテキスト・パラメータ」を参照してください。
警告:
JDKロギング・フレームワークを使用するアプリケーションでは、CoherenceもJDKロギングを使用するように構成できます。ただし、ログ・レベルをFINESTに設定すると、ログ・レベル内のセッションIDを公開できることに注意してください。
キャッシュ・デリゲータは、同一のセッション・インスタンスへの同時アクセスが必要なアプリケーションで使用されます。
キャッシュ・デリゲータ・クラスは、分散キャッシュ内のデータ操作(取得、配置および削除)を担当するクラスです。web.xml
ファイルの<coherence-cache-delegator-class>
コンテキスト・パラメータを使用して、このデータ操作を担当するクラス名を指定します。
このコンテキスト・パラメータで可能な値は、com.tangosol.coherence.servlet.LocalSessionCacheDelegator
クラスなどです。このクラスは、セッション・インスタンスの保存および取得に分散キャッシュが使用される前に、ローカル・キャッシュが使用される必要があることを示しています。このデリゲータは、同一のセッション・インスタンスへの同時アクセスが必要なアプリケーションで有用です。
注意:
PeopleSoftアプリケーションを使用する場合は、この機能を有効にする必要があります。
LocalSessionCacheDelegator
キャッシュ・デリゲータを有効にするには、web.xml
で次の項目を構成する必要があります。
coherence-cache-delegator-class
コンテキスト・パラメータの値をcom.tangosol.coherence.servlet.LocalSessionCacheDelegator
に設定する。
coherence-preserve-attributes
コンテキスト・パラメータをtrue
に設定して、シリアライズされていないオブジェクトのセッション・オブジェクトへの保存を許可します。
coherence-distributioncontroller-class
コンテキスト・パラメータの値をcom.tangosol.coherence.servlet.AbstractHttpSessionCollection$HybridController
に設定します。この値を設定することで、すべてのセッションおよびシリアライズ可能な属性が強制的に分散管理されます。Serializable
インタフェースを実装していないすべてのセッション属性は、ローカルのままとなります。このコンテキスト・パラメータを使用するには、coherence-sticky-sessions
最適化も有効にする必要があることに注意してください。
例4-5に、web.xml
ファイルのキャッシュ・デリゲータの構成例を示します。
例4-5 web.xmlファイルのキャッシュ・デリゲータの構成
... <context-param> <param-name>coherence-cache-delegator-class</param-name> <param-value>com.tangosol.coherence.servlet.LocalSessionCacheDelegator </param-value> </context-param> <context-param> <param-name>coherence-preserve-attributes</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>coherence-distributioncontroller-class</param-name> <param-value>com.tangosol.coherence.servlet.AbstractHttpSessionCollection$HybridController</param-value> </context-param> ...