4

アプリケーションに分散ロックの実装が必要です。多数の独立したワーカー プロセスがあり、一度に 1 つのアカウントでしか動作できないという制限を適用する必要があります。

アプリケーションは、mongo db レイヤーを使用して c# で記述されています。mongo のクラスター バランサーが分散ロック メカニズムを使用して、どの mongos がバランシングを行っているかを制御していることに気付きました。アプリで同じメカニズムを再利用できるかどうか疑問に思っていました。

独自の分散ロック メカニズムを実装するオーバーヘッドはなく、すべてのワーカー プロセスが既に mongo とやり取りしているので、それらの実装を再利用できれば素晴らしいと思います。

4

1 に答える 1

5

MongoDBには、固有のドキュメントレベルのロックまたは分散ロックドライバーAPIはありません。

シャーディングの分割と移行のためのMongoDBの内部ロックは、シャードクラスターの構成サーバーに対して2フェーズコミットパターンを使用します。同様のパターンを自分で実装することもできます。MongoDBのドキュメントに例があります:2フェーズコミットの実行

ワーカーが同じアカウントドキュメントを同時に更新するのを防ぐためにセマフォが必要な場合、これはやり過ぎになる可能性があります。より簡単なアプローチはlock、アカウントドキュメントにアドバイザリフィールド(または埋め込みドキュメント)を追加して、現在ドキュメントを使用しているワーカープロセスを示すことです。ロックは、ワーカーの開始時に設定し、終了時に削除することができます。おそらく、ロック情報にワーカープロセスIDとタイムスタンプの両方を含めて、古いロックを見つけて削除できるようにする必要があります。

どのアプローチでも、ロックの実装を確認して尊重するために、ワーカープロセス間の調整が必要であることに注意してください。

于 2013-01-06T05:01:59.510 に答える