第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 を設定します。

  1. 宣言的またはプログラム的メソッドを使用してグループを有効にします。
  2. 組み込みグループまたは非組み込みグループのいずれかを指定します。これらのグループのタイプに関する詳細は、「組み込みグループの指定」および「非組み込みグループの指定」を参照してください。
  3. 指定した 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();