Coherenceの機能はクラスタ・サービスの概念に基づいています。各クラスタ・ノードは、任意の数の名前付きサービスに参加できます(これはサービスの提供と取得の両方が可能であることを意味します)。これらの名前付きサービスはすでに存在している(1つ以上の他のクラスタ・ノードですでに実行されている)場合があります。存在していない場合は、新しい名前付きサービスをクラスタ・ノードに登録できます。それぞれの名前付きサービスには、クラスタ内でそのサービスを一意に識別するためのサービス名と、サービスの機能を定義するサービス・タイプが設定されています。各サービス・タイプ(rootクラスタ・サービスを除く)には、複数の名前付きインスタンスが存在する場合もあります。類似点に基づいて、サービス・インスタンスはデータベース・スキーマに、データ・サービスの場合はホストのNamedCacheがデータベース・テーブルに、それぞれ大まかに対応しています。サービスは完全に構成可能ですが、Coherenceに付属するデフォルトのサービス・セットのみを必要とするアプリケーションがほとんどです。Coherenceでサポートされるサービス・タイプには、次のものがあります。
接続サービス
クラスタ・サービス: クラスタ・ノードがクラスタに参加する必要がある場合に自動的に起動されます。各クラスタ・ノードでは常に、このタイプのサービスが1つだけ実行されます。このサービスの役割は、他のクラスタ・ノードの検出、クラスタ・ノードの障害(停止)の検出、およびクラスタ内の他のサービスの可用性の登録です。つまり、クラスタ・サービスは、クラスタ内のメンバーシップとサービスを追跡します。
プロキシ・サービス: 一般のアプリケーションは、クライアントもすべてクラスタ・メンバーになるように構成されます。ただし、クライアントをクラスタの外部で実行することが望ましい使用例もあります。特に、膨大な数のクライアント・プロセスがある場合や、クライアントがJavaプラットフォームで実行されていない場合、またはより高い結合度が求められる場合などです。このサービスを使用すると、クラスタの外部で実行されるクライアントからの接続が可能になります(TCP使用)。
処理サービス
起動サービス: このサービスはクラスタ化された起動を提供し、グリッド・コンピューティング・アーキテクチャをサポートします。起動サービスを使用すると、クラスタ内の任意のノードまたはノード・グループにあるエージェント、あるいはクラスタ全体に存在するエージェントをアプリケーション・コードから起動できます。エージェントの起動には、リクエスト/レスポンス方式、fire and forget方式、または非同期のユーザー定義可能な方式を使用できます。
データ・サービス
分散キャッシュ・サービス: この分散キャッシュ・サービスを使用すると、キャッシュ内のデータがそれぞれ1つのクラスタ・ノードのみで管理(保持)されるよう、クラスタ全体で各クラスタ・ノードにデータを分散(パーティション化)することができます。分散キャッシュ・サービスは、ペシミスティック・ロックをサポートしています。また、データ損失のないフェイルオーバーをサポートするために、各データが1つ以上の他のクラスタ・ノードにバックアップされるようサービスを構成することも可能です。さらには、一部のクラスタ・ノードのみデータをまったく保持しないように構成することもできます。これは、分散データを保持しないようにアプリケーション・サーバー・プロセスを設定し、追加のキャッシュ・サーバーJVMを実行して分散キャッシュ記憶域を提供することで、アプリケーション・サーバー・プロセスのJavaヒープ・サイズを制限する場合などに有用です。
レプリケーション・キャッシュ・サービス: このサービスを実行するすべてのクラスタ・ノードに自身のすべてのデータを完全にレプリケートする、同期化されたレプリケーション・キャッシュ・サービスです。さらに、このサービスはペシミスティック・ロックをサポートしているため、更新の欠落といった古典的な問題を引き起こすことなく、クラスタ内でデータを変更できます。ニア・キャッシュおよび連続問合せキャッシュを導入することで、レプリケートされたキャッシュのほぼすべての機能が分散キャッシュ・サービスに加えて利用可能になり、より頑強なものとなります。ただし、レプリケートされたキャッシュは、一般には内部アプリケーション・メタデータの管理に使用されます。
オプティミスティック・キャッシュ・サービス: これは、レプリケーション・キャッシュ・サービスのオプティミスティック並行処理バージョンです。自身のすべてのデータをすべてのクラスタ・ノードに完全にレプリケートし、一貫性を維持するためにオプティミスティック・データベース・ロックと同様の最適化を採用しています。一貫性においては、同一時刻に異なるサーバーから複数の更新が実行されても、最終的にはすべてのサーバーが同じ現在値になるという事実に注目しています。オプティミスティック・キャッシュ・サービスはペシミスティック・ロックをサポートしていないため、通常は、最後に認識した値を読取り専用の目的でキャッシュする場合のみ使用することをお薦めします。このサービスが使用されることはめったにありません。
リソースに関して、クラスタ・サービスは通常1つのデーモン・スレッドを使用しますが、さらに大きな処理帯域幅を持つサービスを提供するために、オプションで、構成可能なスレッド・プールを使用します。たとえば、起動サービスと分散キャッシュ・サービスはどちらもスレッド・プーリングを完全にサポートすることで、データベースのロード処理、パラレル分散問合せ、およびエージェントの起動を加速化します。
重要なことは、これらはクラスタ・サービスの基本にすぎず、Coherenceが提供するキャッシュ・タイプの完全なセットではないということです。クラスタ・サービスをバッキング・マップやオーバーフロー・マップなどのキャッシュ機能と組み合せることにより、Coherenceは、きわめて柔軟性の高い、容易に構成できる強力なクラスタ・アプリケーション向けのオプション・セットを提供できます。たとえば、ニア・キャッシュ機能では、分散キャッシュがこの機能のコンポーネントとして使用されます。
キャッシュ・サービス内には、任意の数の名前付きキャッシュが存在します。名前付きキャッシュは標準のJCache APIを提供します。このAPIは、キーと値のペアを保持するjava.util.Map
というJavaコレクションAPIをベースとしています。Map
インタフェースは、たとえばJavaのHashtable
クラスで実装されるものと同じAPIです。