私は現在Nodeアプリを作成しており、スケーリングを先取りすることを考えています。私が理解しているように、水平スケーリングは、より多くの同時リクエストを処理するためにアプリケーションをスケールアップする簡単な方法の1つです。私の作業コピーは現在、バックエンドでMongoDbを使用しています。
したがって、私の質問は次のとおりです。順序を厳密に維持する必要があるリンクリストに似たデータ構造があります。私の(想像上の)懸念は、複数のノードインスタンスを介してデータベースに競合状態が発生した場合、リンクリストの解決が正しくない可能性があることです。
例を挙げると、このリストa->bを持つサーバーを想像してみてください。インスタンス1はオブジェクトcに付属し、インスタンス2はオブジェクトdに付属します。両方のインスタンスがa->bを読み取り、独自のオブジェクトをリストに追加することを決定する競合状態が存在する可能性があります。インスタンス1は、挿入がa-> b-> cであると想定し、インスタンス2は、データベースが実際にa-> b-> c-> dを保持している場合、それがa->b->dであると想定します。
一般に、これは楽観的ロックの仕事のように聞こえますが、私が理解しているように、MongoDBもRedis(私が検討している他のデータベース)もSQL方式でトランザクションを実行しません。
したがって、私は解決策が以下のいずれかであると想像します:
フラグを使用して、MongoDBで独自のトランザクションを実装します。クライアントはロック変数に対してfindAndModifyを実行し、成功した場合は操作を実行します。失敗した場合、クライアントは特定のタイムアウト後に再試行します。
同じ効果を実現するには、Redisトランザクションとpubsubを使用します。これを行う方法はまだ正確にはわかりませんが、もっともらしいと思われます。
ある種のスマートな負荷分散を実装します。複数のクライアントが同じアイテムを操作している場合は、それらを同じインスタンスにルーティングします。JSはシングルスレッドなので、問題は解決します。残念ながら、私はそれに対する簡単な解決策を見つけられませんでした。
上記を達成するためのより良い、よりエレガントな方法が存在すると確信しており、解決策や提案を聞いてみたいと思います。ありがとうございました!