私の目標を最もよく説明するために、問題を要件の基本に単純化します。わかりやすくするために詳細が必要な場合はお知らせください。
割り当て可能な10個の一意の番号(0〜9)があるとします。どの番号が予約されているか、または無料であるかは、データベースに含まれています。実行中のフロントエンドWebサービスの目標は、割り当てのために番号を正常に要求することです。番号が特定のノードに割り当てられると、その番号は予約され、他のノードに割り当てることはできません。
これは、単一障害点のない分散システムであることに注意してください。
私に問題を与えている警告は、カサンドラの結果整合性の概念です。レイテンシーが高くなる代わりに、Cassandraを完全に一貫性のあるものに調整できることに注意してください。それが私の最善の(そしておそらく唯一の)オプションである場合、私はそれを行うことができますが、一貫性の調整の概念を維持したいと思います。
戦略についての私の考えは、ノードで次のことを行うことです。
1)Cassandraにクエリを実行して、空き番号のリストを取得します。
2)フリーナンバーの1つをランダムに選択します。
3)このノードがその番号を予約したことを示すPuttoCassandraを実行します。
4)Cassandraに継続的にクエリを実行して、どのノードが番号を正常に予約したかを確認します。(読み取りが割り当てをすぐに反映しない場合があるため、継続的に要求してください。)
5)返されたノード名が、このノードの予約が提出された名前である場合、予約は成功しました。
6)返されたノード名が別のノード名である場合は、別のノードがこの番号とほぼ同時に番号を要求し、割り当てが与えられたことを意味します。このノードはステップ1に戻って、再試行する必要があります。
上記の戦略を使用すると、特定の状況でエラー(二重割り当てなど)が発生するという奇妙な感覚があります。
他の誰かが私の提案された戦略についてコメントし、おそらく彼ら自身を提供することができますか?ありがとう。