シナリオは次のとおりです。サーブレットコンテナ内で実行されているマルチスレッドの Java Web アプリケーションがあります。アプリケーションは、サーブレット コンテナー内に複数回デプロイされます。異なるサーバーで複数のサーブレット コンテナーが実行されています。
おそらく、このグラフは次のことを明確にしています。
server1
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
server2
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
これらすべてのスレッドがアクセスできるネットワーク共有ディレクトリ内にファイルがあります。そして、彼らは頻繁にファイルにアクセスします。ほとんどの場合、ファイルはそれらのスレッドによってのみ読み取られます。でもたまに書いてある。
データの一貫性が保証されるように、これらすべてのスレッドを同期するためのフェイル セーフ ソリューションが必要です。
(適切に)機能しないソリューション:
java.nio.channels.FileLock
を使用すると、FileLock クラスを使用して、異なるサーバーからスレッドを同期できます。ただし、ファイル ロックはプロセス全体で使用できるため、これは同じプロセス (サーブレット コンテナー) 内のスレッドでは機能しません。同期
に別のファイルを使用すると、プロセスがファイルに対して読み取りまたは書き込みを行っていることを示す別のファイルを作成できます。このソリューションはすべてのスレッドで機能しますが、いくつかの欠点があります。- パフォーマンス。ファイルの作成、削除、およびチェックは、かなり遅い操作です。1 つの同期ファイルを使用した低重量の実装では、ファイルの並列読み取りが妨げられます。
- JVM がクラッシュした後も同期ファイルが残り、手動によるクリーンアップが必要になります。
- ネットワークファイルシステム上のファイルを削除するという奇妙な問題がすでに発生しています。
メッセージング
の使用 スレッドがファイル アクセスを調整するために使用するメッセージング システムを実装できます。しかし、これはこの問題には複雑すぎるようです。繰り返しますが、パフォーマンスは低下します。
何かご意見は?