20.6.2.3. サーバーノードのハッシュコード計算
仮想ノードのサポートを追加すると、帯域幅によりバージョン 1.0 が非現実的になり、クラスター内の全仮想ノードのハッシュコードを返す必要があります(この数は、数百万に簡単になる可能性があります)。そのため、Hotgitops プロトコルのバージョン 1.1 では、クライアントには各サーバーのベースハッシュ ID またはハッシュコードが指定されるため、各サーバーの実際のハッシュ位置を仮想ノードが設定されていない状態で、または両方計算する必要があります。ノードのハッシュコードの計算を試みる際に、ルールクライアントに従う必要があります。
1\.仮想ノードが無効 の場合: クライアントがサーバーのベースハッシュコードを受信したら、ハッシュ wheel の正確な位置を見つけるために、それらを正規化する必要があります。正規化のプロセスには、ベースハッシュコードをハッシュ関数に渡して、負の値を避けるために小さな計算を行う必要があります。生成される数字は、ハッシュ wheel におけるノードの位置になります。
public static int getNormalizedHash(int nodeBaseHashCode, Hash hashFct) {
return hashFct.hash(nodeBaseHashCode) & Integer.MAX_VALUE; // make sure no negative numbers are involved.
}
2\.仮想ノードが有効 な場合: この場合、各ノードは N つの異なる仮想ノードを表し、各仮想ノードのハッシュコードを計算するには、0 から N-1 までの数字を取り、以下のロジックを適用する必要があります。
- 0 が id である仮想ノードの場合は、前のセクションで示したように、ノードのハッシュコードの取得に使用する手法を使用します。
- 1 から N-1 id の仮想ノードの場合は、以下のロジックを実行します。
public static int virtualNodeHashCode(int nodeBaseHashCode, int id, Hash hashFct) {
int virtualNodeBaseHashCode = id;
virtualNodeBaseHashCode = 31 * virtualNodeBaseHashCode + nodeBaseHashCode;
return getNormalizedHash(virtualNodeBaseHashCode, hashFct);
}