2 つの Tomcat インスタンスからロード バランシングを介して利用できる Java Spring アプリケーション。
ユーザーは、並行して実行できない複雑なタスクをアプリケーションに送信できます。数時間前に同様のタスクが既に実行されている場合、一部のタスクはスキップする必要があります。
ストレージとして Oracle DB と RabbitMQ を使用していますが、実行中のアプリケーション間および選択したアプリケーションのスレッド内でアトミック操作と同期を実行するためにそれらを使用する方法がわかりません。
複雑な問題の 1 つ - フェイル セイフティ。あるアプリケーションが何らかの操作を実行するためにロックを取得して停止した場合 (またはサーバーのダウン、ハードウェア障害など)、タイムアウト後にロックを解放して、別のアプリケーションまたは復元された最初のアプリケーションがクリーンアップ アクションを実行できるようにする必要があります。タスクを再実行します。
そのため、一度に 1 つのアプリケーションだけでタスクを実行するために、Java アプリケーションを安全な方法で同期する可能性を探しています。
PS正式には、次の永続的なストレージが必要です。
ID
DATE
STATE
ここで、ID
はタスク タイプ、はアトミック操作DATE
による変更の最新時刻です。STATE
- 完了または失敗
STATE
から、ロックをオンにして実行に原子的に変更します。実行中または回復中に選択された場合- falseを返します。それ以外の場合は実行中に設定され、現在の時刻に更新されます。ID
ID
STATE
STATE
DATE
- 現在の状態から離れすぎている場合は、現在の状態に更新して、実行状態または回復
STATE
状態から回復状態にアトミックに変更します (タスクの実行または回復が失敗したことを示すため)。ロックを取得できない場合、またはタスクが実行中または回復中でない場合はfalseを返します。STATE
DATE
DATE
ID
STATE
- 現在の状態に更新すると、回復
STATE
から失敗に原子的に変更されます。ロックを取得できない場合、またはタスクが回復中でない場合はfalseを返します。DATE
ID
STATE
これらの操作は、フェイルセーフ タスクの同期を行うのに十分なようです...