Coherenceは、サービスの集合として設計されています。Coherenceの各サービスは、関連付けられた構成とともに、サービスを実装するCoherenceコードで構成されています。サービスは、リクエストを受信してレスポンスを返すキューが関連付けられているスレッドの割当てプールで実行されます。
Coherenceでは、リエントラント・コールがサポートされていません。リエントラント・サービス・コールは、サービス・スレッドがリクエストを処理しようとするときにその同じサービスに対してリクエストが行われると発生します。サービスに対するリクエストはすべてインバウンド・キューを使用して配信され、Coherenceはリクエストごとに1スレッドのモデルを使用するため、リエントラント・リクエストのそれぞれが他のスレッドを消費することになります(レスポンスを待っている間はコール側のスレッドがブロックします)。用語としては再帰型に似ていますが、概念が異なるため区別する必要があります。
サービスは、サービス名とサービス・タイプ(起動、レプリケーション、分散など)の一意の組合せとして定義されます。たとえば、分散サービスDist-Customers
からDist-Inventory
という名前の分散サービスをコールしたり、Dist-Customers
という名前の分散サービスからRepl-Catalog
という名前のレプリケーション・サービスをコールできます。サービス名は、<service-name>
要素を使用して、キャッシュ・コンフィギュレーション・ファイルで構成されます。
Coherenceの現在の実装では、コールがローカルであるかリモートであるかは重要ではありません。このため、親子関係の構築の効率化をサポートするキーの対応付けの使用法が複雑になります。キーの対応付けを使用して親オブジェクトとそのすべての子オブジェクトを共存させる場合は、親オブジェクトにEntryProcessorを送信し、そのEntryProcessor
で(ローカルの)子オブジェクトを把握することはできません。これは、子オブジェクトがすでに処理中である場合も同様です。
親オブジェクトと子オブジェクトの両方にアクセスするには、次のいずれかの方法を使用できます。
子オブジェクトを親オブジェクトに埋め込む(集約パターンを使用)。
サーバー側のバッキング・マップへの直接アクセスを使用する(安全に実行するには高度な知識が必要)。
別のサービス(PartitionedService.getKeyOwner
の使用でターゲットとする起動など)でロジックを実行し、そのサービスからNamedCache
インタフェースを使用してデータにアクセスする。
リエントラント・コールが可能な別のサービスに子オブジェクトを配置する(ただし、複数の異なるキャッシュ・サービスのパーティション間にはアフィニティがないためネットワーク・アクセスが発生)。
ほとんどの使用状況では、集約パターンの使用が最適な方法になります。ただし、この方法が(サイズの制限などによって)現実的でなく、クライアント/サーバー・モデルを使用しないで親オブジェクトと子オブジェクトの両方にアクセスする必要がある場合には、起動サービスを使用する方法が、大半の用途で最適な解決方法になります。
リエントラントが許容される場合も、スレッド・プールの飽和および壊滅的なデッドロックの発生を慎重に回避する必要があります。たとえば、サービスAがサービスBをコールし、サービスBがサービスAをコールする場合、同時コールが多数発生してスレッド・プールのいずれかが満杯になり、一種のデッドロックが発生する可能性があります。従来のロックと同様、アクセスに順序付けすること(たとえば、サービスAはサービスBのコールが可能であるが、サービスBはサービスAをコールできないようにする)が回避に役立ちます。
このため、次のように対処します。
サービスAからサービスAをコールすることは許可しない。
サービスAからサービスBをコールし、サービスBからサービスAをコールすることは技術的には可能だが、デッドロックが発生しやすくなるため、可能なかぎり使用しない。
サービスAがサービスBを、サービスBがサービスCを、サービスCがサービスAをコールすることを同様に制限する。
サービスAからサービスBをコールすることは許可する。
サービスAがサービスBを、サービスBがサービスCを、サービスAがサービスCをコールすることを同様に許可する
サービス・スレッドは、Coherence APIリクエストの実現に関連するスレッドとして定義されます。サービス・スレッドは、次のエンティティのいずれかを起動できます。
マップ・リスナー
メンバーシップ・リスナー
ネットワーク・フィルタ
カスタムのシリアライズ/デシリアライズ(ExternalizableLite
実装など)
バッキング・マップ・リスナー
CacheLoader
/CacheStore
モジュール
問合せロジック(Aggregators
、Filters
、ValueExtractors
、Comparators
など)
入力プロセッサ
トリガー
InvocationService
起動可能ファイル
これらのエンティティは、自己のサービスに対するリエントラント・コールを行いません。