0

同じソフトウェアを2台のサーバーで実行しています。このソフトウェアの各部分は、実行されるジョブを特定の時間に昼食するクォーツを実行します。両方のサーバーのクロックが同期していると仮定すると、これら2つのジョブは同時に開始され、同じことを実行します... 1つのジョブだけを実行し、もう1つのジョブは実行しないようにするにはどうすればよいですか?

私もデータベースを持っており、最初に考えたのは、ジョブの開始時に行を挿入する場所のテーブルを作成し、当日のレコードがあるかどうかを確認することでした(ある場合は、ジョブの実行をスキップします...)。サーバーのクロックが完全に同期されている場合、両方のアプリが同時に書き込みとチェックを行うため、このメカニズムは役に立たなくなります。

他にどのようなソリューションを実装できますか?

4

1 に答える 1

2

クラスター'日!

クォーツクラスター
(出典:quartz-scheduler.org

基本的に、両方のQuartzスケジューラーは同じデータベースを使用して同期し、1台の(アイドル状態の)マシンでのみジョブを実行します。

ただし、サーバーのクロックが完全に同期されている場合は、両方のアプリが同時に書き込みとチェックを行うため、このメカニズムは役に立たなくなります。

これはまさにクォーツが行うことです!ただし、一部のデータベースロック/トランザクションメカニズムを使用しているため、1つのインスタンスが新しいジョブをフェッチするときに、2番目のインスタンスは待機する必要があります。


両方のサーバーのクロックが同期していると仮定します

クラスタで実行するには、同期されたクロックが必要です。

何らかの形式の時刻同期サービスを使用してクロックが同期されていない限り、別々のマシンでクラスタリングを実行しないでください

于 2012-10-03T13:25:42.127 に答える