第6章 クラスタリング
キャッシュマネージャーは、ローカル(スタンドアロン)またはクラスター化のいずれかに設定できます。クラスター化すると、マネージャーインスタンスは JGroups の検出プロトコルを使用して、同じローカルネットワーク上の近傍インスタンスを自動的に検出し、クラスターを形成します。
ローカルのみのキャッシュマネージャーの作成は簡単なです。no-argument DefaultCacheManager コンストラクターを使用するか、以下の XML 設定ファイルを指定するだけです。
<infinispan/>
<infinispan/>
クラスターキャッシュマネージャーを起動するには、クラスター構成を作成する必要があります。
GlobalConfigurationBuilder gcb = GlobalConfigurationBuilder.defaultClusteredBuilder(); DefaultCacheManager manager = new DefaultCacheManager(gcb.build());
GlobalConfigurationBuilder gcb = GlobalConfigurationBuilder.defaultClusteredBuilder();
DefaultCacheManager manager = new DefaultCacheManager(gcb.build());
<infinispan>
<cache-container>
<transport/>
</cache-container>
</infinispan>
<infinispan>
<cache-container>
<transport/>
</cache-container>
</infinispan>
個別のキャッシュは、異なるモードで設定できます。
- ローカル: 変更と読み取りは複製されません。これは、クラスター化されていないキャッシュマネージャーで使用できる唯一のモードです。
- Invalidation: 変更はレプリケートされません。代わりに、キーがすべてのノードで無効にされます。読み取りはローカルになります。
- replicated: 変更はすべてのノードにレプリケートされ、読み取りは常にローカルになります。
- Distributed (分散): 変更が固定された数のノードに複製され、最低でも 1 つの所有者ノードから値を読み取ります。
6.1. ローカルモード リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Data Grid はクラスター化モードで特に興味がありますが、非常に多くのローカルモードも提供します。このモードでは、ConcurrentHashMap と同様の単純なインメモリーデータキャッシュとして機能します。
ただし、マップではなくローカルキャッシュを使用するのはなぜでしょうか。キャッシュは、単純なマップよりも多くの機能を提供します。これには、永続ストアへのライトスルーおよびライトビハインド、エントリーのエビクション、メモリー不足や有効期限の発生を防ぐことができます。
Red Hat Data Grid の Cache インターフェースは、JDK の ConcurrentMap ConcurrentMap で Red Hat Data Grid trivial への移行を拡張します。
Red Hat Data Grid キャッシュは、既存のトランザクションマネージャーと統合するか、別のトランザクションマネージャーを実行するか、トランザクションもサポートしています。ローカルキャッシュトランザクションには、2 つの選択肢があります。
-
ロックのタイミング。悲観的ロックは、書き込み操作時、またはユーザーが
AdvancedCache.lock(keys)を明示的に呼び出したときにキーをロックします。楽観的ロックは、トランザクションのコミット中にのみキーをロックし、代わりに、現在のトランザクションがキーを読み取った後に別のトランザクションが同じキーを変更した場合は、コミット時にWriteSkewCheckExceptionをスローします。 - 分離レベルread-committed および repeatable read をサポートします。
6.1.1. 簡易キャッシュ リンクのコピーリンクがクリップボードにコピーされました!
従来のローカルキャッシュは、クラスター化されたキャッシュと同じアーキテクチャーを使用します。つまり、インターセプタースタックを使用します。これにより、多くの実装を再利用できます。ただし、高度な機能が不要でパフォーマンスがより重要な場合は、インターセプタースタックを削除して、単純なキャッシュを使用できます。
そのため、どの機能も削除されますか。設定の観点からは、簡単なキャッシュは以下に対応していません。
- トランザクションと呼び出しバッチ処理
- 永続性(キャッシュストアおよびローダー)
- カスタムインターセプター(インターセプタースタックなし)
- インデックス化
- 互換性(組み込み/サーバーモード)
- バイナリーとして保存(ローカルキャッシュに非常に便利です)
API パースペクティブから、これらの機能は例外をスローします。
- カスタムインターセプターの追加
- 分散済みエグゼキューターフレームワーク
そして、何が残っていますか。
- 基本的なマップのような API
- キャッシュリスナー(ローカルリスナー)
- 有効期限
- eviction
- security
- JMX アクセス
- 統計(ただし、最大のパフォーマンスを得るには、statistics-available=false を使用してこれをオフにすることが推奨されます)
6.1.1.1. 宣言型設定 リンクのコピーリンクがクリップボードにコピーされました!
<local-cache name="mySimpleCache" simple-cache="true">
<!-- expiration, eviction, security... -->
</local-cache>
<local-cache name="mySimpleCache" simple-cache="true">
<!-- expiration, eviction, security... -->
</local-cache>
6.1.1.2. プログラムによる設定 リンクのコピーリンクがクリップボードにコピーされました!
CacheManager cm = getCacheManager();
ConfigurationBuilder builder = new ConfigurationBuilder().simpleCache(true);
cm.defineConfiguration("mySimpleCache", builder.build());
Cache cache = cm.getCache("mySimpleCache");
CacheManager cm = getCacheManager();
ConfigurationBuilder builder = new ConfigurationBuilder().simpleCache(true);
cm.defineConfiguration("mySimpleCache", builder.build());
Cache cache = cm.getCache("mySimpleCache");
サポートされていない機能に対する簡単なキャッシュチェック。たとえばトランザクションを使用するよう設定すると、設定検証によって例外が出力されます。