2017-10-23 14 views
0

現在、私はバックエンドがMongoDBのNodejsとORMのmongooseで作成されたWebアプリケーションに取り組んでいます。クラスタ化されたプロセス間のNode.jsデータベースミューテックス

本番環境で稼働している場合、アプリケーションはクラスタ化されており、実行中のマルチコアマシンを利用できます。

データベース内のフラグをチェックするAPIのエンドポイントにメソッドがあります。このフラグが設定されていない場合は、メソッドが再度実行されないようにこのフラグを書き込みます。

私の質問は、2人のユーザーが同時にこの方法を起動し、1人のユーザーが1つの「クラスタ」で処理され、他のユーザーが他の「クラスタ」によって処理される場合です。この状況は競合状態になり、一貫性のない状態になってしまいますか?

このアプリは多くの同時ユーザーを処理するため、この可能性があります。

V8はシングルループで動作するため、クラスタ化されていない環境では起こりませんが、クラスタ化された環境はどうですか?

ありがとうございました!

答えて

0

この状況は競合状態になり、矛盾した状態になっていますか?

はい、これは競合状態です。矛盾した状態については、それらのすべての人がフラグを設定していれば、これはとにかくアトミックな操作(またはそれですか?)なので、一貫性のない状態に終わることはありません。しかし、非原子的な操作のために悪いです。

この状況を処理する1つの方法は、ロックを使用することです。グーグルの「nodejs distributed lock」では興味深いライブラリはほとんどありません。

+0

MongoDBは、単一ドキュメント操作ではアトミックです。これは、現在更新中のドキュメントを読み込もうとすると、イベントループは更新操作が読み込みを待つことになります。これは私にとっては問題ありません。たぶん私がやらなければならないことは、関数の先頭でドキュメントを更新してから、最初にチェックして更新する代わりにフラグをチェックすることです。私はあまりにも自分自身を説明していないかもしれない。 – Jorge

+0

@Jorge注文を変更することは問題ではありませんが、競合状態はそのままで、逆順になります。更新がアトミックの場合、ロックを行う必要はありません。アトミック性の定義によって中間値を読み取ることは不可能であるため、問題はありません。複数のクライアントが更新するかどうかは関係ありません。 1回のプロセスで1回限りのクエリ(私が正しく理解している場合)です。もっと複雑な操作の場合は、 'upsert'フラグを挿入したり、' findAndModify'を使うことができます。適切なデータベース(はい、mongoは適切なデータベースではありません)では、単にトランザクションを使用します。 – freakish

+0

完璧な@freakish!どうもありがとうございました :) – Jorge

関連する問題