28.5. キーアフィニティーサービス
キーアフィニティーサービスを使用すると、分散された Red Hat JBoss Data Grid クラスターの特定のノードに値を配置できます。サービスは、識別する指定済みクラスターアドレスに基いて、ハッシュ化されたキーを特定のノードに返します。
キーアフィニティーサービスにより返されたキーは、ユーザー名などの意味を持つことができません。これらは、このレコードのためにアプリケーション全体で使用される無作為の ID にすぎません。提供されたキージェネレーターは、このサービスにより返されるキーが一意であることを保証しません。カスタムキー形式について、KeyGenerator の独自の実装を渡すことができます。
このサービスの参照を取得し、使用する方法の例を以下に示します。
例28.2 キーアフィニティーサービス
EmbeddedCacheManager cacheManager = getCacheManager();
Cache cache = cacheManager.getCache();
KeyAffinityService keyAffinityService =
KeyAffinityServiceFactory.newLocalKeyAffinityService(
cache,
new RndKeyGenerator(),
Executors.newSingleThreadExecutor(),
100);
Object localKey = keyAffinityService.getKeyForAddress(cacheManager.getAddress());
cache.put(localKey, "yourValue");
以下の手順は、提供された例の説明です。
手順28.3 キーアフィニティーサービスの使用
- キャッシュマネージャーおよびキャッシュの参照を取得します。
- これにより、サービスが起動され、キーを生成し、キューに格納するために、提供された
Executorが使用されます。 - ローカルノードにマップされるサービスからキーを取得します (
cacheManager.getAddress()はローカルアドレスを返します)。 KeyAffinityServiceから取得されたキーを持つエントリーは常に、提供されたアドレスを持つノードに格納されます。この場合は、ローカルノードになります。
28.5.1. ライフサイクル
KeyAffinityService は、 Lifecycle を拡張します。これにより、キーアフィニティーサービスを停止、起動、および再起動することが可能になります。
例28.3 キーアフィニティーサービスライフサイクルパラメーター
public interface Lifecycle {
void start();
void stop();
}
サービスは、
KeyAffinityServiceFactory を介してインスタンス化されます。すべてのファクトリーメソッドは非同期キー生成に使用される Executor を持つため、これは呼び出し元のスレッドで使用されません。ユーザーはこの Executor のシャットダウンを制御します。
KeyAffinityService は、必要なくなったときに明示的に停止する必要があります。これにより、バックグラウンドキー生成が停止され、保持された他のリソースがリリースされます。KeyAffinityServce は、登録したキャッシュマネージャーがシャットダウンされた場合のみ停止します。
28.5.2. トポロジーの変更
KeyAffinityService キーの所有権は、トポロジーが変更されると、変わることがあります。キーアフィニティーサービスは、トポロジーの変更と更新を監視し、古いキーまたは指定されたものと異なるノードにマップされるキーを返さないようにします。ただし、キーが使用されたときにノードアフィニティーが変更されないことは保証されません。以下に例を示します。
- スレッド (
T1) は、ノード (A) にマップされるキー (K1) を読み取ります。 - トポロジーが変更され、
K1がノードBにマップされます。 T1はK1を使用してキャッシュにデータを追加します。この時点でK1は読み取り時に要求されたものと異なるノードであるBにマップされます。
上記のシナリオは理想的ではありませんが、クラスターの変更中にすでに使用中のキーを移動できるため、アプリケーションのサポートされた動作です。
KeyAffinityService は安定したクラスターに対してアクセス近接の最適化を提供します。トポロジーの変更が安定的でないときには適用されません。