0

apache commons vfs を使用して、ファイル システム上のディレクトリ X をリッスンする Java プロセスがあります。新しいファイルがこのディレクトリにエクスポートされるたびに、プロセスが開始されます。最初にファイルの名前を filename.processing に変更してファイル名を解析し、ファイルから情報を取得してテーブルに挿入してから、このファイルをドキュメント管理システムに送信します。 . これは、クラスターごとのシングルスレッド アプリケーションです。これをクラスタ環境で実行するとします。5 つのサーバーがあります。したがって、5 つの異なる VM が同じファイルにアクセスしようとしています。OS は複数のプロセスが同時にファイルを変更することを許可しないため、実装全体は、一度に 1 つのプロセスのみがファイルの名前を .processing に変更できることに基づいていました。クラスターがファイルを保持して名前を .processing に変更すると、他のクラスター'

これは 1 年以上前から問題なく機能していましたが、たった今、重複がほとんど見つかりませんでした。複数のクラスターがファイルを取得したようです。この場合、クラスター a、b、c がファイル f.pdf にアクセスし、同時に f.pdf.processing に名前を変更したとします (私はまだ困惑しています)。 OS がファイルを同時に変更できるようにする方法)。これらの結果として、クラスター a、b、c はファイルを処理し、文書管理システムに送信します。したがって、3 つの重複ファイルがあります。

つまり、私が見ているのは、クラスター環境でタスクを1回だけ実行するアプローチです。また、クラスターに問題が発生した場合に別のクラスターがタスクを引き継ぐように、フェイルオーバー メカニズムも備えたいと考えています。ボックスで master=true のような環境変数を設定したくありません。これは、1 つのクラスターのみに制限され、フェイルオーバーを処理しないためです。

どんな種類の助けも大歓迎です。

4

3 に答える 3

1

ファイルのロックに関する次の投稿を参照してください:ファイルシステムは同時読み取り/書き込みをどのように処理しますか?

ファイルの読み取りおよび書き込み操作 (名前の変更を含む) はアトミックではなく、想定したようにプロセス間で十分に同期されていません。少なくともほとんどのオペレーティング システムではそうではありません。

ただし、通常、新しいファイルの作成はアトミック操作です。あなたはそれを有利に利用することができます。この概念は、ファイル全体のロックと呼ばれます。

于 2015-12-11T22:11:02.870 に答える
1

アプリケーション データベース内の共有ロック テーブルを使用して、独自の同期ロジックを実装しています。これにより、すべてのクラスター ノードは、実際にジョブ自体を開始する前に、ジョブが既に実行されているかどうかを確認できます。

于 2015-12-21T21:59:53.103 に答える