第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();

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.