ニア・キャッシュは、最後に使用した(MRU: Most Recently Used)データと最も頻繁に使用する(MFU: Most Frequently Used)データの読取りアクセスの速度を上げて、レプリケーション・キャッシュ・サービスの長所である最大のパフォーマンスとパーティション・キャッシュ・サービスの長所である最大のスケーラビリティの両方を最大限に実現します。ニア・キャッシュには、フロント・キャッシュとバック・キャッシュの2つのキャッシュが含まれています。これらはリードスルー/ライトスルー方式を使用することにより、互いに自動的および透過的に通信します。
フロント・キャッシュは、ローカル・キャッシュ・アクセスを提供します。高速でサイズも限られていることから、低コストといえます。バック・キャッシュは、ローカル・キャッシュが使用不能な場合に必要に応じてロードできる、集中型のキャッシュまたは複数層構成のキャッシュです。バック・キャッシュは、非常に容量が大きいという点で完璧かつ適切ですが、アクセス速度の点では割高といえます。ニア・キャッシュの使用はCoherence*Extendのみに制限されず、TCMPでも使用できます。
この設計により、ニア・キャッシュでは、最も基本的な有効期間ベースのキャッシュや無効化ベースのキャッシュから、整合性の保証が可能な高度なデータバージョン・キャッシュまで、様々なレベルでキャッシュの整合性を構成できます。その結果、ローカル・メモリー・リソースを維持するという点と、真のローカル・キャッシュのパフォーマンス上の利点を活用するという点のバランスを調整することができます。
一般的なデプロイメントでは、フロント・キャッシュにローカル・キャッシュが使用されます。ローカル・キャッシュは、スレッド・セーフである、並行性が高い、サイズ制限がある、自動的に失効する、データがオブジェクト形式で保存される、などの点から妥当な選択といえます。バック・キャッシュには、リモートのパーティション・キャッシュが使用されます。
次の図は、ニア・キャッシュのデータ・フローを示しています。クライアントがオブジェクトDをグリッドに書き込むと、このオブジェクトは、ローカルJVM内のローカル・キャッシュ、およびそれをバックアップする(バックアップ・コピーを含む)パーティション・キャッシュに配置されます。クライアントがオブジェクトをリクエストすると、オブジェクトはローカル、すなわちフロント・キャッシュからオブジェクト形式で待機することなく取得されます。
フロント・キャッシュで失効しているオブジェクトまたは無効化されているオブジェクトがクライアントからリクエストされた場合、Coherenceは自動的にパーティション・キャッシュからそのオブジェクトを取得します。フロント・キャッシュがオブジェクトで更新されてから、オブジェクトがクライアントに配信されます。
無効化方針は、ニア・キャッシュのフロント・キャッシュとバック・キャッシュの同期を維持します。ニア・キャッシュでは、バック・キャッシュの特定のイベントをリスニングして、フロント・キャッシュ内のエントリを自動的に更新または無効化するように構成できます。ニア・キャッシュでは、バック・キャッシュの他のプロセスによって変更されたフロント・キャッシュのエントリの無効化方針が4通りあり、バック・キャッシュで実装されるインタフェースに応じた方針を選択できます。
表11-1は、これらの無効化方針についてまとめたものです。無効化方針およびリードスルー/ライトスルー方式の詳細は、第12章「リードスルー、ライトスルー、ライトビハインドおよびリフレッシュアヘッドのキャッシュ」を参照してください。
表11-1 ニア・キャッシュの無効化方針
方針名 | 説明 |
---|---|
None |
無効化イベントを一切リスニングしないようにキャッシュに指示します。この方針は、現在値ではない可能性があるデータの使用がビジネス要件で許可されており、パフォーマンスおよびスケーラビリティがともに低い場合に最適です。データの鮮度は、フロント・キャッシュの十分に要約されたエビクション・ポリシーを使用することによって保証できます。 |
Present |
現在フロント・キャッシュに存在しているアイテムのみに関連するバック・キャッシュのイベントがニア・キャッシュでリスニングされるように指定します。この方針は、フロント・キャッシュの各インスタンスに、フロント・キャッシュの他のインスタンス(スティッキーなデータ・アクセス・パターンなど)に関連するデータの個別のサブセットが含まれている場合に最適です。 |
All |
バック・キャッシュのすべてのイベントがニア・キャッシュでリスニングされるように指定します。この方針は、フロント・キャッシュの様々なインスタンス間に著しい重複が存在する、読取り頻度の高い段階的なアクセス・パターンに最適です。 |
Auto |
キャッシュ統計に基づいて |
ニア・キャッシュは、coherence-cache-config
ファイルの<near-scheme>
要素を使用して構成します。この要素には、ローカル(フロント層)キャッシュを構成するためのfront-schemeと、リモート(バック層)キャッシュを定義するためのback-schemeの2つのサブ要素が必要です。フロント層には通常、ローカル・キャッシュ(<local-scheme>
)を選択しますが、Javaオブジェクトに基づくスキーム(<class-scheme>
)や、.NetとC++クライアント以外については、JVMヒープベース以外のキャッシュ(<external-scheme>
または<paged-external-scheme>
)も使用できます。
リモート、すなわちバック層のキャッシュは、<back-scheme
>要素を使用して記述します。バック層のキャッシュには、分散キャッシュ(<distributed-scheme
>)またはリモート・キャッシュ(<remote-cache-scheme
>)を定義できます。<remote-cache-scheme>
要素を使用すると、現在のクラスタの外部からクラスタ・キャッシュを使用できます。
<near-scheme>
のオプションのサブ要素には、フロント層とバック層のオブジェクトの同期を維持する方法を指定する<invalidation-strategy>
、およびキャッシュで発生したイベントの通知を受け取るリスナーを指定する<listener>
などがあります。
構成例については、「ニア・キャッシュ構成のサンプル」を参照してください。ファイルに含まれる各要素の詳細は、<near-scheme>
のトピックを参照してください。
Coherenceでは、構成済ニア・キャッシュへの参照を名前によって取得する、com.tangosol.net.CacheFactory
クラスのメソッドを提供しています。次に例を示します。
これらのAPIの詳細は、C++によるキャッシュ参照の取得および.NETによるキャッシュ参照の取得に関する項を参照してください。
すべてのNamedCache
実装のインスタンスは、NearCache
を含め、不要になった時点でNamedCache.release()
メソッドをコールして明示的に解放する必要があります。これにより、インスタンスで保持されているリソースがすべて解放されます。
特定のNamedCache
がアプリケーションの継続期間を通して使用される場合、リソースはそのアプリケーションがシャットダウンされたとき、または停止したときにクリーンアップされます。ただし、わずかの間だけ使用される場合は、使い終わった時点でアプリケーションからrelease()
メソッドをコールする必要があります。
次のサンプル・コードは、ニア・キャッシュの構成を示しています。ニア・キャッシュは<near-scheme>
のサブ要素で定義されます。<front-scheme>
要素はローカル(フロント)キャッシュの構成に、<back-scheme>
要素はリモート(バック)キャッシュの定義に使用されていることに注目してください。ニア・キャッシュの各要素の詳細は、<near-scheme>
のトピックを参照してください。
例11-2 ニア・キャッシュ構成のサンプル
<?xml version='1.0'?> <cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config" xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-config coherence-cache-config.xsd"> <caching-scheme-mapping> <cache-mapping> <cache-name>example-near-cache</cache-name> <scheme-name>example-near</scheme-name> </cache-mapping> </caching-scheme-mapping> <caching-schemes> <local-scheme> <scheme-name>example-local</scheme-name> </local-scheme> <near-scheme> <scheme-name>example-near</scheme-name> <front-scheme> <local-scheme> <scheme-ref>example-local</scheme-ref> </local-scheme> </front-scheme> <back-scheme> <remote-cache-scheme> <scheme-ref>example-remote</scheme-ref> </remote-cache-scheme> </back-scheme> </near-scheme> <remote-cache-scheme> <scheme-name>example-remote</scheme-name> <service-name>ExtendTcpCacheService</service-name> <initiator-config> <tcp-initiator> <remote-addresses> <socket-address> <address>localhost</address> <port>9099</port> </socket-address> </remote-addresses> <connect-timeout>5s</connect-timeout> </tcp-initiator> <outgoing-message-handler> <request-timeout>30s</request-timeout> </outgoing-message-handler> </initiator-config> </remote-cache-scheme> </caching-schemes> </cache-config>