第6章 グループ化 API
6.1. グループ化 API
グループ化 API は、エントリーのグループを指定のノードやグループのハッシュを使用して選択されたノードに移動できます。
6.2. グループ化 API の操作
通常、Red Hat JBoss Data Grid は特定のキーのハッシュを使用してエントリーの宛先ノードを決定します。しかし、グループ化 API を使用する場合、キーのハッシュではなくキーに関連するグループのハッシュを使用して宛先ノードを決定します。
各ノードはアルゴリズムを使用して各キーの所有者を決定します。これにより、ノード間のエントリーの場所に関するメタデータ (およびメタデータの更新) を渡す必要がなくなります。これは、以下の理由で有用です。
- コストの高いノード全体のメタデータ更新を行わずに、すべてのノードは特定のキーを所有するノードを判断できます。
- ノードの障害時に所有権情報をレプリケートする必要がないため、冗長性が改善されます。
グループ化 API を使用する場合、各ノードはエントリーの所有者を判断できる必要があります。そのため、グループを手作業で指定することはできず、以下のいずれかである必要があります。
- エントリーへの組み込み。キークラスによって生成されたことを意味します。
- エントリーに対して外部的。外部機能によって生成されたことを意味します。
6.3. グループ化 API のユースケース
この機能を使用すると、論理的に関連するデータを 1 つのノードで格納できます。たとえば、キャッシュにユーザー情報が含まれる場合、1 つの場所に存在するすべてのユーザーの情報を 1 つのノードで格納できます。
この方法の利点は、特定のデータ (論理的に関連する) が必要な場合に、分散エクゼキューター (Distributed Executor) のタスクがクラスターのすべてのノード全体ではなく関連するノードでのみ実行されるよう指示されることです。このように操作が指示されるため、パフォーマンスが最適化されます。
グループ化 API の例
Acme 社は世界中に 100 以上の支店を持つ家電販売会社です。支店によって多くの部門の社員が勤務する支店と1、2 部門の社員のみが勤務する支店があります。人事部所属の社員はバンコク、ロンドン、シカゴ、ニース、およびベネチアに勤務しています。
Acme 社は人事部用の社員記録をすべてキャッシュの単一のノード (ノード AB) に移動するため、Red Hat JBoss Data Grid のグループ化 API を使用します。そのため、人事部所属の社員が記録を読み出ししようとすると、DistributedExecutor
はノード AB のみをチェックし、必要な社員記録を迅速かつ簡単に呼び出します。
説明どおりに 1 つのノードで関連するエントリーを格納した場合、クラスターのすべてのノードではなく 1 つのノード (またはノードの小さなサブセット) で情報を検索することで、データのアクセスを最適化し、無駄な時間やリソースの発生を防ぐことができます。
6.4. グループ化 API の設定
6.4.1. グループ化 API の設定
以下の手順にしたがってグループ化 API を設定します。
- 宣言的またはプログラム的メソッドを使用してグループを有効にします。
- 組み込みグループまたは非組み込みグループのいずれかを指定します。これらのグループのタイプに関する詳細は、「組み込みグループの指定」および「非組み込みグループの指定」を参照してください。
- 指定した grouper をすべて登録します。
6.4.2. グループの有効化
グループ化 API を設定するための最初のステップは、グループの有効化です。以下の例は、グループを有効にする方法を示しています。
Configuration c = new ConfigurationBuilder().clustering().hash().groups().enabled().build();
6.4.3. 埋め込みグループの指定
次の場合は、組み込みグループをグループ化 API で使用します。
- キークラスの定義を変更できる場合 (変更不可能なライブラリーの一部でない)。
- キークラスがキーバリューペアグループの判断を考慮しない場合。
関連するメソッドで @Group
アノテーションを使用して組み込みグループを指定します。以下の例のように、グループは常に String である必要があります。
組み込みグループの指定例
class User { <!-- Additional configuration information here --> String office; <!-- Additional configuration information here --> public int hashCode() { // Defines the hash for the key, normally used to determine location <!-- Additional configuration information here --> } // Override the location by specifying a group, all keys in the same // group end up with the same owner @Group String getOffice() { return office; } }
6.4.4. 組み込みグループの指定
次の場合は、非組み込みグループをグループ化 API で使用します。
- キークラスの定義を変更できない場合 (変更不可能なライブラリーの一部である)。
- キークラスがキーバリューペアグループの判断を考慮する場合。
組み込みグループは、Grouper
インターフェースの実装を使用して指定されます。このインターフェースは computeGroup
メソッドを使用してグループを返します。
組み込みグループを指定するとき、 Grouper
インターフェースは算出した値を computeGroup
に渡してインターセプターとして動作します。@Group
アノテーションが使用される場合、このアノテーションを使用するグループが最初の Grouper
に渡されます。そのため、組み込みグループを使用するとより優れた制御が提供されます。
非組み込みグループの指定例
以下の例は、パターンを使用してキーからグループを抽出するためにキークラスを使用する簡単な Grouper
で構成されます。このような場合、キークラスで指定されたグループ情報は無視されます。
public class KXGrouper implements Grouper<String> { // A pattern that can extract from a "kX" (e.g. k1, k2) style key // The pattern requires a String key, of length 2, where the first character is // "k" and the second character is a digit. We take that digit, and perform // modular arithmetic on it to assign it to group "1" or group "2". private static Pattern kPattern = Pattern.compile("(^k)(\\d)$"); public String computeGroup(String key, String group) { Matcher matcher = kPattern.matcher(key); if (matcher.matches()) { String g = Integer.parseInt(matcher.group(2)) % 2 + ""; return g; } else return null; } public Class<String> getKeyType() { return String.class; } }
6.4.5. Grouper の登録
作成後、各 grouper を使用するには登録する必要があります。
grouper のプログラムを使った登録
Configuration c = new ConfigurationBuilder().clustering().hash().groups().addGrouper(new KXGrouper()).enabled().build();