0

複数の VM で集中化ロジックを実現しようとしています。たとえば、5 つの VM で 1 つのアプリケーションを実行しています。1 つのタスクを実行するのは 1 つの VM だけです。そのVMのホスト名をデータベースに書き込んでいますが、その名前をデータベースに更新するには、JavaクライアントAPIを使用してロックを実現する必要がありました。同時に2〜3台のVMが起動する可能性があるためです。それを達成する方法は?

更新: findandModify を使用できます。しかし、私のコードは次のようになります

{
  if(collection.getCount({"taskName" :"Task1"}) == 0){
    //insert record  ------ **I can use findAndModify here**
 }
}

ただし、2 つの VM が同時に起動すると、ドキュメントが利用できないため、両方とも if ブロック内に入ります。
findAndModify がアトミックであることは理解しています。したがって、1 つの VM が findAndModify コマンドを発行した後、ホスト名を持つ 1 つのレコードが作成されます。ただし、次の VM も同じ操作を実行し、そのホスト名でレコードを再度更新します。

私の質問が明確でない場合はお知らせください。

4

1 に答える 1

0

mongodb のドキュメントごとの更新はアトミックです。そのため、クライアント側でロック メカニズムを実装する必要はありません。コメントに記載されているように、ユースケースについてはこちらを確認してください。

アップデート

クエリ部分では、ドキュメントに$existsを使用して「ホスト名」があるかどうかを確認できます。Task1 のドキュメントにホスト名がある場合、そのタスクを担当する VM がすでに存在することを意味します。私はあなたのユースケース全体を知りませんが、VM1はドキュメントを更新してフィールド「ホスト名」を削除できるタスクを完了したとしましょう。または、ホスト名に「」のようなデフォルト値を使用して、ホスト名が「」で、タスク名が「Task1」であるかどうかを確認できます。

于 2013-10-28T16:52:44.113 に答える