1

識別子 (自動生成、数値、再利用可能) に基づいて相互に通信するオブジェクトの分散ネットワークを作成する必要があります。衝突を起こさずにグラフの各ノードにオブジェクトを作成するにはどうすればよいですか?

今のところ、マスターノードを使用して ID を割り当てていますが、このソリューションには他のノードでのオブジェクトの非同期作成が含まれており、これを削除したいと考えています。特に、アプリケーションはリアルタイムであることを意図しているため、RDBMS は使用できません。

これがかなり古典的な分散コンピューティングの問題であることは承知していますが、適切に検索するための語彙が不足している可能性があります。

TCP は私が使用できる唯一のプロトコルであり、ネットワークは遅延の影響を受けます。重要な場合、私は C++ で作業していますが、ライブラリではなくアルゴリズムを探しています。

4

3 に答える 3

2

UUIDを識別子として使用することをお勧めします。これらは設計上一意であるため、追加のアルゴリズム サポートは必要ありません。

于 2012-11-14T08:42:48.260 に答える
2

一度に ID を割り当てるマスター ノードの代わりに、一度にブロックまたは ID の範囲を各ノードに割り当てることができます。次に、各ノードは、必要に応じてそのブロック内から ID を割り当てます。

ノードの ID が少なくなると、マスターに別のブロックを要求します。このようにして、ノードはオブジェクトを非同期に作成でき、一意の ID が保証されます。

オブジェクトが削除されると、ID は再利用のためにプールに返されると想定しています。

マスター ノードに ID の配布を任せたくない場合のもう 1 つのオプションは、イーサネット MAC アドレスまたは IP アドレスにカウンターを付加したものを使用して ID を構成することです。これには、重複する IP アドレスまたは MAC アドレスがネットワーク上に表示されないようにする必要があります。この ID は 16 ビットより大きくなります。

ただし、すべてのノードが同じネットワーク上にある場合、たとえば IP アドレス AA.BB.CC.DD の場合、DD を最初の 8 ビットとして使用し、次の 8 ビットをカウンタとして使用できます。これは、ノードごとに 256 個の ID しか提供しないため、十分ではない可能性があります。サブネットが小さい場合は、カウンターに使用できるビットが明らかに増え、問題を解決するのに十分な可能性があります。

于 2012-11-14T23:58:56.197 に答える
0

ランダムに作成するだけです。128ビットのランダムな値では、衝突の可能性は非常に小さいため、ゼロであると見なすことができます。128ビットのuuidスペースでは、衝突の確率は2 ^ 64(誕生日のパラドックス)です。

明らかに、優れたエントロピーソースが必要です。クラシックsha1(time(NULL))はノーゴーです;)

さらに重要なのは、ノードがUUIDをランダムに選択する場合、UUIDを作成してノードに提供する中央コーディネーターはまったく必要ないということです。各ノードは、それ自体で独自のUUIDを作成します。

于 2012-11-14T08:46:41.460 に答える