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 キーアフィニティーサービスの使用

  1. キャッシュマネージャーおよびキャッシュの参照を取得します。
  2. これにより、サービスが起動され、キーを生成し、キューに格納するために、提供された Executor が使用されます。
  3. ローカルノードにマップされるサービスからキーを取得します (cacheManager.getAddress() はローカルアドレスを返します)。
  4. KeyAffinityService から取得されたキーを持つエントリーは常に、提供されたアドレスを持つノードに格納されます。この場合は、ローカルノードになります。

28.5.1. ライフサイクル

KeyAffinityService は、 Lifecycle を拡張します。これにより、キーアフィニティーサービスを停止、起動、および再起動することが可能になります。

例28.3 キーアフィニティーサービスライフサイクルパラメーター

public interface Lifecycle {  
     void start();   
     void stop();
}
サービスは、KeyAffinityServiceFactory を介してインスタンス化されます。すべてのファクトリーメソッドは非同期キー生成に使用される Executor を持つため、これは呼び出し元のスレッドで使用されません。ユーザーはこの Executor のシャットダウンを制御します。
KeyAffinityService は、必要なくなったときに明示的に停止する必要があります。これにより、バックグラウンドキー生成が停止され、保持された他のリソースがリリースされます。KeyAffinityServce は、登録したキャッシュマネージャーがシャットダウンされた場合のみ停止します。

28.5.2. トポロジーの変更

KeyAffinityService キーの所有権は、トポロジーが変更されると、変わることがあります。キーアフィニティーサービスは、トポロジーの変更と更新を監視し、古いキーまたは指定されたものと異なるノードにマップされるキーを返さないようにします。ただし、キーが使用されたときにノードアフィニティーが変更されないことは保証されません。以下に例を示します。
  1. スレッド (T1) は、ノード (A) にマップされるキー (K1) を読み取ります。
  2. トポロジーが変更され、K1 がノード B にマップされます。
  3. T1K1 を使用してキャッシュにデータを追加します。この時点で K1 は読み取り時に要求されたものと異なるノードである B にマップされます。
上記のシナリオは理想的ではありませんが、クラスターの変更中にすでに使用中のキーを移動できるため、アプリケーションのサポートされた動作です。KeyAffinityService は安定したクラスターに対してアクセス近接の最適化を提供します。トポロジーの変更が安定的でないときには適用されません。