2

私の目標を最もよく説明するために、問題を要件の基本に単純化します。わかりやすくするために詳細が必要な場合はお知らせください。

割り当て可能な10個の一意の番号(0〜9)があるとします。どの番号が予約されているか、または無料であるかは、データベースに含まれています。実行中のフロントエンドWebサービスの目標は、割り当てのために番号を正常に要求することです。番号が特定のノードに割り当てられると、その番号は予約され、他のノードに割り当てることはできません。

これは、単一障害点のない分散システムであることに注意してください。

私に問題を与えている警告は、カサンドラの結果整合性の概念です。レイテンシーが高くなる代わりに、Cassandraを完全に一貫性のあるものに調整できることに注意してください。それが私の最善の(そしておそらく唯一の)オプションである場合、私はそれを行うことができますが、一貫性の調整の概念を維持したいと思います。

戦略についての私の考えは、ノードで次のことを行うことです。

1)Cassandraにクエリを実行して、空き番号のリストを取得します。

2)フリーナンバーの1つをランダムに選択します。

3)このノードがその番号を予約したことを示すPuttoCassandraを実行します。

4)Cassandraに継続的にクエリを実行して、どのノードが番号を正常に予約したかを確認します。(読み取りが割り当てをすぐに反映しない場合があるため、継続的に要求してください。)

5)返されたノード名が、このノードの予約が提出された名前である場合、予約は成功しました。

6)返されたノード名が別のノード名である場合は、別のノードがこの番号とほぼ同時に番号を要求し、割り当てが与えられたことを意味します。このノードはステップ1に戻って、再試行する必要があります。

上記の戦略を使用すると、特定の状況でエラー(二重割り当てなど)が発生するという奇妙な感覚があります。

他の誰かが私の提案された戦略についてコメントし、おそらく彼ら自身を提供することができますか?ありがとう。

4

2 に答える 2

2

ApacheZooKeeperをチェックすることをお勧めします。それはまさにあなたが必要としているもののようです。ZooKeeperを使用して、新しい割り当てを取得し、既存の割り当てをCassandraに保存できます。

于 2011-08-27T20:28:16.110 に答える
0

アプリケーションに応じて、固定された数字のセットから1つを選択する必要が本当にありますか?他のノードが選択していない一意の番号を選択するだけでよい場合は、たとえばhttp://docs.python.org/library/uuidを使用して、ノードごとにUUID(Universally Unique IDentifier)を生成することでそれを行うことができます。 html

于 2011-08-31T13:15:39.380 に答える