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
は安定したクラスターに対してアクセス近接の最適化を提供します。トポロジーの変更が安定的でないときには適用されません。