ニア・キャッシュの目的は、最後に使用した(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>要素を使用して構成します。この要素には、ローカル(フロント層)キャッシュを構成するためのフロントスキームと、リモート(バック層)キャッシュを定義するためのバック・スキームの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クラスを通じて、構成済ニア・キャッシュへの参照を名前によって取得するメソッドを提供しています。次に例を示します。
Coherenceでは、Javaクライアント、C++クライアントまたは.NETクライアント用のニア・キャッシュも構成できます。
すべてのNamedCache実装のインスタンスは、NearCacheを含め、不要になった時点でNamedCache.release()メソッドをコールして明示的に解放する必要があります。これにより、インスタンスで保持されているリソースがすべて解放されます。
特定のNamedCacheがアプリケーションの継続期間を通して使用される場合、リソースはそのアプリケーションがシャットダウンされたとき、または停止したときにクリーンアップされます。ただし、わずかの間だけ使用される場合は、使い終わった時点でアプリケーションからrelease()メソッドをコールする必要があります。
次のサンプル・コードは、ニア・キャッシュ構成を示しています。ニア・キャッシュは<near-scheme>のサブ要素で定義されます。<front-scheme>要素はローカル(フロント)キャッシュ構成に、<back-scheme>要素はリモート(バック)キャッシュの定義に使用されていることに注目してください。ニア・キャッシュの各要素の詳細は、<near-scheme>のトピックを参照してください。
例11-2 ニア・キャッシュ構成のサンプル
<?xml version="1.0"?>
<cache-config>
<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>