1 Coherenceの概要

Coherenceアプリケーションを開発する前に、ある程度時間をかけて重要なCoherenceの概念と機能について学習します。

この章の内容は次のとおりです。

基本的な概念

Coherenceのクラスタリング、構成、キャッシュ、データ記憶域、およびシリアライズについて学習します。

この項には次のトピックが含まれます:

クラスタ化されたデータの管理

Coherenceの中核をなすのは、クラスタ化されたデータ管理の概念です。この概念を実現するには、次の目標を達成する必要があります。

  • 完全に一貫した、単一システム・イメージ(SSI)

  • 読取りおよび書込みアクセスのスケーラビリティ

  • 高速で透過的なフェイルオーバーおよびフェイルバック

  • 記憶域および処理の線形スケーラビリティ

  • シングル・ポイント障害(SPOF)の排除

  • クラスタ全体のロックおよびトランザクション

この基盤の上に、データベース・キャッシング、HTTPセッション管理、グリッド・エージェントの起動、分散問合せなど、Coherenceが提供する様々なサービスが構築されます。これらの機能を詳細に説明する前に、いくつかの基本的なCoherenceの側面について説明します。

論理層の単一のAPI、物理層のXML構成

Coherenceでは、クラスタ化されたデータを管理するために、多数のトポロジがサポートされています。これらの各トポロジには、パフォーマンスとフォルト・トレランスに関してトレードオフがあります。単一のAPIを使用することで、必要に応じてトポロジの選択をデプロイまで遅延できます。これにより、開発者はCoherenceの一貫した論理表示を確認しながら、チューニング時またはアプリケーションで変更が必要なときの柔軟性を確保できます。

キャッシング方針

Coherenceは複数のキャッシュ実装を提供しています。

  • ローカル・キャッシュ – 非クラスタ化キャッシング用のローカルのヒープ上のキャッシング。ローカル・キャッシュの理解を参照してください。

  • 分散キャッシュ – 読取りおよび書込みアクセスに対して線形スケーラビリティが実現されます。データはノード間で自動的、動的、および透過的にパーティション化されます。分散アルゴリズムがネットワーク・トラフィックを最小化し、データが徐々に移動されることでサービスの停止が回避されます。分散キャッシュの理解を参照してください。

  • ニア・キャッシュ – 分散キャッシングのスケーラビリティで、ローカル・キャッシングのパフォーマンスが提供されます。パフォーマンスと同期の保証とのトレードオフに応じて、様々な戦略でのニア・キャッシュが可能です。ニア・キャッシュの理解を参照してください。

  • レプリケート・キャッシュ – 容量の少ない、頻繁に読取りが実行されるキャッシュに最適です。レプリケート・キャッシュの理解を参照してください。

  • ビュー・キャッシュ – 容量の少ない、頻繁に読取りが実行されるキャッシュに最適です。「ビュー・キャッシュの理解」を参照してください。

インプロセス・キャッシングでは、オブジェクトがローカルJVM内で管理されるため、最高レベルのrawパフォーマンスを提供します。この利点は、ローカル、レプリケート、オプティミスティックおよびニア・キャッシュの実装により最も直接的に実現されます。

アウトオブプロセス(クライアント/サーバー)キャッシングには、専用キャッシュ・サーバーを使用するオプションが用意されています。これは、ワークロードをパーティション化する(アプリケーション・サーバーの負荷を軽減するため)場合に役立ちます。これは、パーティション・キャッシュの実装を使用して、単一のコマンド行オプション、またはXML構成の1行のエントリでクライアント・ノードのローカル記憶域を無効化するだけで実行できます。

(ニア・キャッシュ機能を使用した)階層キャッシングにより、アプリケーション・サーバー上のローカル・キャッシュと、より大きなキャッシュ・サーバー上のパーティション・キャッシュを組み合せて、パーティション・キャッシュのスケーラビリティとローカル・キャッシュのrawパフォーマンスを融合できます。これは、専用キャッシュ・サーバーおよび同一の場所に配置されたキャッシング(アプリケーション・サーバーJVM内に保存されたキャッシュ・パーティション)の実装に役立ちます。

キャッシュの使用を参照してください。

データ記憶域の各オプション

ほとんどのユーザーは、ヒープ上の記憶域を専用キャッシュ・サーバーと組み合せて使用しますが、Coherenceにはデータ記憶域用の複数のオプションがあります。

  • ヒープ上—最速のオプション。ただし、JVMガベージ・コレクションの実行時間に影響する場合があります。

  • ジャーナル—ジャーナル技術を使用し、ソリッド・ステート・ディスク向けに最適化されたRAM記憶域とディスク記憶域の組合せ。ジャーナルベースの記憶域では、シリアライズおよびデシリアライズが必須です。

  • ファイルベース—Berkeley Database JEの記憶域システムを使用します。

Coherenceの記憶域は一時的なものであり、ディスクベースの記憶域オプションではキャッシュされたデータのみを管理します。Coherenceには、永続記憶域として、CacheLoaderやCacheStoreのほか、バッキング・マップが用意されています。

記憶域およびバッキング・マップの実装を参照してください。

シリアライズの各オプション

シリアライズは、多くの場合、クラスタ化されたデータ管理における最も費用を要する部分になるため、Coherenceではデータのシリアライズ/デシリアライズ用に次のオプションを用意しています。

  • com.tangosol.io.pof.PofSerializer - Portable Object Format (POF)は言語に依存しないバイナリ形式です。POFは領域と時間の両面で効率を向上させるように設計された、Coherenceの推奨シリアライズ・オプションです。Portable Object Formatの使用を参照してください

  • java.io.Serializable - 最も単純で処理の遅いオプション。

  • java.io.Externalizable - 開発者が手動でシリアライズを実装する必要がありますが、パフォーマンスの大幅な向上が見込めます。java.io.Serializableと比べて、シリアライズされたデータのサイズを2倍以上削減できます(分散キャッシュでは、一般的にデータがシリアライズされた形式でキャッシュされるため特に有用です)。最も重要なのは、CPU使用率が劇的に削減されるということです。

  • com.tangosol.io.ExternalizableLite - java.io.Externalizableと非常によく似ていますが、より効率的なI/Oストリームの実装を使用することで、パフォーマンスの向上とメモリー使用量の削減を図れます。

  • com.tangosol.run.xml.XmlBeanExternalizableLiteのデフォルトの実装です。

構成可能性および拡張性

CoherenceのAPIでは、Coherenceのすべての機能へのアクセスを提供します。このAPIで最も頻繁に使用されるサブセットは、単純なXMLオプションを介して公開されるため、一般的な使用例での作業が最低限に抑えられます。APIを介した直接の構成と、より簡単なXML構成を組み合せても問題はありません。

Coherenceは、必要に応じてそのモジュールを置換できるように設計されています。たとえば、ローカルのバッキング・マップ(各ノードの実際の物理データ記憶域を提供する)は、必要に応じて簡単に置換できます。これは、ほとんどの場合は不要ですが、万が一のために用意されています。一般的な目安として、作業の80%は簡単に実行できますが、残りの20%(特殊なケース)の作業は多少の労力を要します。ただし、ほとんどの場合、難無く実行できるはずです。

ネームスペースの階層

Coherenceは、サービス・セットとして編成されます。その基礎となるのはクラスタ・サービスです。クラスタは、Coherenceインスタンス(各コンピュータの1つ以上のJVMで、JVMごとに1つのインスタンスを持つ)のセットとして定義されます。Coherenceクラスタの概要を参照してください。クラスタ・サービスの下には、Coherence APIを構成する各種サービスがあります。これには、様々なキャッシング・サービス(レプリケート、分散など)および起動サービス(クラスタの様々なノードへのエージェントのデプロイ用)が含まれます。サービスの各インスタンスには名前が付けられ、各タイプには、通常、デフォルトのサービス・インスタンスがあります。キャッシュ・サービスには、名前付きキャッシュ(com.tangosol.net.NamedCache)が含まれます。これはデータベース表と似ており、通常は関連するオブジェクトのセットが含まれます。

読取り/書込みキャッシング

CoherenceのNamedCache APIは、アプリケーションがキャッシュ・インスタンスを取得して、これとやりとりするために使用する主要インタフェースです。

この項には次のトピックが含まれます:

NamedCache

次のソース・コードは、NamedCacheインスタンスへの参照を返します。必要に応じて、基礎となるキャッシュ・サービスが起動されます。

import com.tangosol.net.*;
...
NamedCache cache = CacheFactory.getCache("MyCache");

Coherenceでは、MyCacheの名前マッピング用のキャッシュ構成XMLファイルをスキャンします。これは、Webコンテナのweb.xmlファイルにおけるサーブレット名のマッピングと似ています。Coherenceのキャッシュ構成ファイルには、最も単純なケースでのキャッシュ名からキャッシュ・スキームへのマッピングのセットと、キャッシュ・スキームのセットが含まれます。

デフォルトで、Coherenceは、coherence.jarのルートにあるcoherence-cache-config.xmlファイルを使用します。これは、JVMコマンド行上で-Dcoherence.cacheconfig=file.xmlを使用してオーバーライドできます。この引数では、ファイル・システム・パスまたはJavaリソース・パスを参照できます。

com.tangosol.net.NamedCacheインタフェースは、他のいくつかのインタフェースを拡張します。

  • java.util.Mapget()put()remove()などの基本的なMapメソッド。

  • com.tangosol.net.cache.CacheMap—キャッシュ内のキーのコレクションを取得(Mapとして)するため、およびオブジェクトをキャッシュに入れるためのメソッド。エントリをキャッシュに入れるときに、有効期限の値を追加することもできます。

  • com.tangosol.util.QueryMap—キャッシュの問合せ用のメソッド「キャッシュ内のデータの問合せ」を参照してください。

  • com.tangosol.util.InvocableMap—キャッシュ・データのサーバー側の処理用メソッドキャッシュ内のデータの処理を参照してください。

  • com.tangosol.util.ObservableMap—キャッシュ・イベントをリスニングするメソッド(マップ・イベントの使用を参照してください)。

  • com.tangosol.util.ConcurrentMaplock()unlock()などの同時アクセス用のメソッド。トランザクションの実行を参照してください。

NamedCacheの使用パターン

NamedCacheの使用方法には、一般的には2つのアプローチがあります。

  • いくつかの追加機能(問合せ、並行性)を持つが、永続性バッキングは含まないjava.util.Mapのクラスタ化された実装(サイド・キャッシュ)。

  • 外部データ・ソースへのアクセスの切離しの手段(インライン・キャッシュ)。この場合、アプリケーションではNamedCacheインタフェースを使用し、このNamedCacheによって、基礎となるデータベース(または他のリソース)が管理されます。

通常、インライン・キャッシュは、次のデータのキャッシュに使用されます。

  • データベース—キャッシュの最も直感的な使用方法。単純にデータベース表を(Javaオブジェクトの形式で)キャッシュします。

  • サービス—メインフレーム、Webサービス、サービス・ビューロ。(計算コストまたは実際のアクセス料金が発生するために)アクセスに多額の費用がかかるリソースを表すサービス。

  • 計算—財務上の計算、集計、およびデータ変換。インライン・キャッシュを使用すると、計算の重複を容易に回避できます。計算が完了している場合、その結果はキャッシュから容易に取得できます。任意のシリアライズ可能なオブジェクトはキャッシュ・キーとして使用できるため、計算パラメータを含むオブジェクトをキャッシュ・キーとして簡単に使用できます。

データ・ソースのキャッシュを参照してください。

ライトバックの各オプションは次のとおりです。

  • ライトスルー—外部データ・ソースに常に最新の情報が含まれるようにします。データをすぐに永続化させる必要がある場合、またはデータ・ソースを他のアプリケーションと共有する場合に使用されます。

  • ライトビハインド—書込みを外部データ・ソースにキャッシュすることで、高いパフォーマンスが得られます。書込みをバッファリングしてデータ・ソースの負荷を分散させることができるだけでなく、複数の書込みを組み合せてI/Oをさらに削減できますデータがすぐにはディスクに永続化されないというデメリットがある一方で、クラスタ全体にすぐに配信されるためサーバー障害に強いというメリットがあります。さらに、データ・セット全体がキャッシュされている場合、このオプションを使用すると、アプリケーションはデータ・ソースの完全な障害を一時的に切り抜けることができます。キャッシュの読取りおよび書込みでは、データ・ソースへの同期アクセスが必要ないからです。

キャッシュの問合せ

Coherenceには、キャッシュされたデータを問い合せる機能が用意されています。パーティション・キャッシュを使用すると、問合せは索引付けされ、並列化されます。つまり、サーバーをパーティション・キャッシュに追加すると、スループット(1秒当たりの問合せ合計)が向上するのみでなく、待機時間が減少して問合せにかかるユーザー時間が短くなります。NamedCacheに問い合せるには、すべてのオブジェクトで共通のインタフェース(またはベース・クラス)を実装する必要があります。オブジェクトの任意のフィールドを問合せできます。索引はオプションで、パフォーマンスを向上させるために使用されます。レプリケート・キャッシュを使用する場合、問合せはローカルで実行され、索引は使用されません。「キャッシュ内のデータの問合せ」を参照してください。

索引をNamedCacheに追加するには、まず値エクストラクタが必要です(入力に値オブジェクトを受け入れ、そのオブジェクトの属性を返します)。索引はいくつでも追加できます(重複した索引は無視されます)。また、キャッシュへのデータの挿入前または挿入後に、いつでも追加できます。

問合せは、キャッシュされたデータにしか適用されないことに注意してください。そのため、データ・セット全体をキャッシュにロードしていない場合は、問合せを使用できません(部分的にロードされたセットを管理するサポートが追加されている場合を除く)。

開発者は問合せ用の追加のカスタム・フィルタを実装して、問合せの並列化を活用できます。特にパフォーマンスを重視する問合せでは、索引に対応したフィルタを実装できます。これにより、Coherenceの内部的な索引構造にアクセスできます。

Coherenceには組込みのオプティマイザがあり、最適な順序で索引を適用します。問合せの対象は限定されるため、オプティマイザは効果的かつ効率的な機能です。オプティマイザを保守する必要はありません。

起動サービス

Coherenceの起動サービスでは、計算エージェントをクラスタ内の様々なノードにデプロイできます。これらのエージェントは、実行スタイル(デプロイして非同期にリスニングする)または問合せスタイル(デプロイして同期的にリスニングする)で実行可能です。キャッシュ内のデータの処理を参照してください。

起動サービスは、InvocationServiceインタフェースを通じてアクセスされ、次の2つのメソッドを含みます。

public void execute(Invocable task, Set setMembers, InvocationObserver observer);
public Map query(Invocable task, Set setMembers);

サービスのインスタンスは、CacheFactoryクラスから取得できます。

Coherenceでは、タスク指向処理のWorkManager APIを実装します。

イベント・プログラミング

Coherenceでは2つのイベント・プログラミング・モデルがサポートされており、これらのモデルによって、アプリケーションはクラスタ操作の通知を受信して反応を返すことができます。アプリケーションは、どのコンピュータがイベントを発生させたのかに関係なく、イベントを論理概念として監視できます。イベントにより、Coherenceをアプリケーション固有のロジックで拡張する一般的な方法が提供されます。

イベント・プログラミング・モデルには、次のものがあります。

  • ライブ・イベント - ライブ・イベント・プログラミング・モデルでは、様々なタイプのイベントを受信するように登録されたユーザー定義イベント・インターセプタを使用します。アプリケーションは、イベント・タイプに基づいて実行するアクションを決定します。マップ・イベントを使用することで使用可能な数々のイベントも、ライブ・イベントの使用でサポートされます。ライブ・イベントの使用を参照してください。

  • マップ・イベント - マップ・イベント・プログラミング・モデルでは、基礎となるマップ実装にアタッチされたユーザー定義マップ・リスナーを使用します。マップ・イベントでは、カスタマイズ可能なサーバーベースのフィルタおよび軽量イベントが提供され、これらによってネットワークのトラフィックおよび処理を最低限に抑えることができます。マップ・リスナーはJavaBeanパラダイムに従っており、システム・キャッシュ・イベント(エビクションなど)やアプリケーション・キャッシュ・イベント(get/put操作など)を区別できます。(マップ・イベントの使用を参照してください)。

トランザクション

Coherenceには、様々なトランザクションの保証が得られる各種のトランザクション・オプションが含まれています。Coherenceのトランザクションのオプションには、ConcurrentMapインタフェースおよびEntryProcessor APIを使用した基本データの並行性、暗黙的ロックおよびEntryProcessor APIを使用したパーティション・レベルのトランザクション、トランザクション・フレームワークAPIを使用したアトミック・トランザクション、Coherenceリソース・アダプタを使用したXAの完全サポートなどがあります。トランザクションの実行を参照してください。

HTTPセッション管理

Coherence*Webは、広範なアプリケーション・サーバーをサポートする、HTTPセッション管理モジュールです。Oracle Coherence*WebでのHTTPセッション・マネージメントの管理Coherence*Webの概要を参照してください。

Coherenceセッション管理を使用する場合、アプリケーションを変更する必要はありません。Coherence*Webでは、ニア・キャッシュを使用して、ほぼ無限のスケーラビリティを持つ完全にフォルト・トレラントなキャッシングを提供します(数百個のクラスタ・ノードで問題なく機能します)。

オブジェクト・リレーショナル・マッピングの統合

ほとんどのORM製品では、CoherenceがL2キャッシング・プラグインとしてサポートされています。これらのソリューションは、Coherence内のエンティティ・データをキャッシュすることで、複数サーバー上のアプリケーションによるキャッシュされたデータの共有を可能にします。詳細は、Oracle Coherenceの統合Coherence APIを使用したJPAの統合を参照してください。

C++/.NETの統合

Coherenceでは、TCP/IP上でのクロス・プラットフォームのクライアントがサポートされます。すべてのクライアントが、同じワイヤ・プロトコルを使用します(サーバーでは、クライアントのプラットフォームの違いが認識されません)。また、これらのいずれのクライアントにもサード・パーティ・コンポーネント(埋込みJVMや言語ブリッジなど)はありません。ワイヤ・プロトコルでは、すべてのクライアント・プラットフォームでイベント・フィードおよび一貫したインプロセス・キャッシングがサポートされます。Oracle Coherenceリモート・クライアントの開発Coherence*Extendの概要を参照してください。

管理およびモニタリング

Coherenceでは、Java Management Extensions (JMX)を使用した管理およびモニタリングの機能が提供されます。Oracle Coherenceの管理Oracle Coherence管理の概要を参照してください。