Coherenceのアーキテクチャはモジュールで構成されています。ほとんどのモジュールは拡張可能であり、カスタム実装に置き換えることもできます。これには、ローカル記憶域が含まれます。ローカル記憶域は、Coherenceで管理されるデータを実際に保存またはキャッシュするデータ構造です。ローカル記憶域を提供するオブジェクトは、同じ標準のコレクション・インタフェースであるjava.util.Map
をサポートする必要があります。Coherenceのローカル記憶域の実装を使用して、レプリケートされたデータや分散データを保存する場合、その機能をバッキング・マップと呼びます。これは、Coherenceがローカル記憶域の実装によって実際に支援(バックアップ)されるためです。その他、ローカル記憶域の一般的な使用法としては、分散キャッシュの前に配置したり、分散キャッシュの後方でバックアップを行うことがあります。
Coherenceは通常、次のいずれかのローカル記憶域の実装を使用しています。
セーフなHashMap: デフォルトのロスレス実装です。ロスレス実装には、JavaのHashtableクラス同様、サイズ制限も自動失効もありません。つまり、自身に含まれるキャッシュ項目を削除する(損失する)ことのない実装です。この特殊なHashMap
実装は、非常に高度なスレッドレベルの並行性に合せて最適化されています(デフォルト実装にはcom.tangosol.util.SafeHashMap
クラスを、キャッシュ・イベントの送信が必要な実装にはcom.tangosol.util.ObservableHashMap
を使用します。これらの実装はスレッドセーフです)。
ローカル・キャッシュ: デフォルトのサイズ制限または自動失効、あるいはその両方の実装です。ローカル・キャッシュについては後で詳しく説明しますが、ここで覚えておくべき重要な点は、キャッシュ・サイズを制限できること、および一定期間後にキャッシュ項目を自動失効できることです(デフォルト実装にはcom.tangosol.net.cache.LocalCache
を使用します。この実装はスレッド・セーフであり、キャッシュ・イベント、com.tangosol.net.CacheLoader
、CacheStore
、および構成可能でプラッガブルなエビクション・ポリシーをサポートします)。
読取り/書込みバッキング・マップ: キャッシュ・ミス発生時にデータベースからロードする、キャッシュのデフォルトのバッキング・マップ実装です。読取り専用キャッシュ(コンシューマ・モデル)として構成することも、ライトスルー・キャッシュまたはライトビハインド・キャッシュ(コンシューマ/プロデューサ・モデル)のいずれかとして構成することもできます。ライトスルーおよびライトビハインド・モードは、分散キャッシュ・サービスで使用することのみを目的としています。ニア・キャッシュとともに使用する場合、ニア・キャッシュと分散キャッシュの同期を維持する必要があるのであれば、(ニア・キャッシュを無効化する目的で)このバッキング・マップをSeppukuベースのニア・キャッシュと組み合せて使用できます。ただし、これらの要件を考慮する場合はバージョニングされた実装を使用することをお薦めします(デフォルト実装にはcom.tangosol.net.cache.ReadWriteBackingMap
クラスを使用します)。
バージョニングされたバッキング・マップ: データ・バージョニング・テクニックを利用してデータ処理を最適化する、読取り/書込みバッキング・マップの最適化バージョンです。たとえば、バージョン変更通知を送信するだけでニア・キャッシュを無効化したり、永続的な(データベースの)バージョン情報を一時的な(キャッシュされた)バージョン情報と比較することで、キャッシュされたデータをデータベースに再び書き込む必要があるかどうかを判断できます。バージョニングされた実装を使用すると、読取りの集中するデータと書込みの集中するデータの両方に対する、大規模なクラスタ内での非常にバランスのとれたパフォーマンスを実現できます(デフォルト実装にはcom.tangosol.net.cache.VersionedBackingMap
クラスを使用します。このバッキング・マップでは、オプションでcom.tangosol.net.cache.VersionedNearCache
をニア・キャッシュ実装として使用できます)。
バイナリ・マップ(Java NIO): 自身の情報をメモリー内(ただしJavaヒープ外)に保存したり、メモリー・マップ・ファイルにも保存できるバッキング・マップ実装です。つまり、Javaヒープ・サイズには影響せず、アプリケーションの一時停止の原因となり得る関連したJVMガベージ・コレクションのパフォーマンスにも影響しないことを意味します。この実装はまた、分散キャッシュのバックアップにも使用できます。これは高可用性を実現するためにバックアップを必要とする、読取り専用(または読取りを主体とする)キャッシュで特に有用です。このバックアップがJavaヒープ・サイズに影響しないにもかかわらず、フェイルオーバー時には瞬時に使用できるためです。
シリアライズ・マップ: 自身のデータをディスクに保存可能な形式(シリアライズ形式)に変換するバッキング・マップ実装です。この実装には、シリアライズ形式のデータを保存するcom.tangosol.io.BinaryStore
オブジェクトが別に必要になります。通常、これは組込みのLHディスク・ストア実装になりますが、シリアライズ・マップはBinaryStore
の任意のカスタム実装をサポートしています(シリアライズ・マップのデフォルト実装にはcom.tangosol.net.cache.SerializationMap
を使用します)。
シリアライズ・キャッシュ: LRUエビクション・ポリシーをサポートするシリアライズ・マップの拡張機能です。ディスク・ファイルのサイズ制限などに使用できます(シリアライズ・キャッシュのデフォルト実装にはcom.tangosol.net.cache.SerializationCache
を使用します)。
オーバーフロー・マップ: オーバーフロー・マップは実際には記憶域を提供しませんが、2つのローカル記憶域の実装を結合し、最初の記憶域がいっぱいになると、オーバーフローを行って次の記憶域にデータを保存することから、この項で紹介しています(OverflowMap
のデフォルト実装にはcom.tangosol.net.cache.OverflowMap
を使用します)。