2016-09-24 10 views
1

私のプロジェクトには、並行性とデータベース管理が含まれています。私はすべてのスレッド間で同時にデータベースを編集しなければならないという意味です。具体的には、私はデータベースから行を読み込み、その行をつかんだことを示す行を挿入しています。これはトランザクションで動作する可能性がありますが、複数のマシンでこのプログラムを実行しているため、それぞれのデータベース接続が異なることになります。私の上記の仕事を達成するための彼らのより良い方法ですか?多数のクエリを扱い、重複を避ける

答えて

4

トランザクションとバージョンフィールド/列(タイムスタンプまたはタイムスタンプとバージョン番号の増加やその他のメカニズム)を使用したオプティミスティック並行性の適用は必須です。

しかし、別のマシンでこれを実行しているので、かなりの量の反復が失敗した可能性があります。トランザクションが発生します。

これを防ぐには、キューイングのメカニズムを使用できます。ディスパッチャプログラムは、未処理のレコードをデータベースから読み取り、キューまたはジョブディスパッチャを使用してワーカーにディスパッチします。その後、各作業者はそのキューからIDを取得し、トランザクション内でそのIDを処理します。

この方法:

  1. トランザクションが失敗した場合、ディスパッチャは、労働者がダウンした場合、他の労働者は
  2. (ダウン気付いするモニタリングの問題です)続けるだろう再び
  3. それをキューう(データベースがボトルネックになっていない限り)いつでもスケールアウトすることができ、新しい従業員を追加することができます。

この場合、リクエスト/返信スキーマは、キューの輻輳。私はNATSを似たような場合にうまく利用しました。もちろん、あなたはあなたが選んだ別のツールを使うことができますが、要求/応答の部分を世話しなければならないことを忘れないでください。キューに物事を投げても問題はすべて解決されず、キューに入れられた作業の量を制御する必要があります。

関連する問題