1

タイトルはちょっと変わっていますが、AppHarbor がバックグラウンド アプリケーションの複数のインスタンスを起動する可能性があるための回避策を見つけようとしています。このアプリケーションは、Quartz.NET を使用して、基本的なスケジュールで重要なイベントをサーバーにプッシュします。ただし、バックグラウンド アプリケーションのインスタンスが 1 つだけであることを保証することはできませんが、各イベントを通常どおりトリガーする必要があります (基本的に、サーバーの POV から 1 つのユニットとして機能します)。

私は当初、ロックと Redis を使用してこれを解決しようとしましたが、十分に機能させることができませんでした。これを達成する方法はありますか?

4

2 に答える 2

1

実行するたびにジョブ自体を再スケジュールすることで、それを行うことができます。スケジュールを指定しませんが、同時に実行する必要がない場合は、一度だけ起動するトリガーを使用してジョブをスケジュールします。ジョブの実行が終了したら、後でもう一度スケジュールを設定します。そうすれば、いつでもストアに 1 つのジョブしかありません。最初のジョブをロードする方法とエラーを処理する方法を工夫する必要があるかもしれませんが、ブートストラップ時にジョブを 1 つだけスケジュールできる限り、それを機能させることができます。

于 2012-08-07T23:26:45.913 に答える
0

Quartz.NET には、クラスタリングのサポートが組み込まれているようです。ドキュメントから:

起動ごとに 1 つのノードのみがジョブを起動します。つまり、ジョブに 10 秒ごとに起動するように指示する繰り返しトリガーがある場合、12:00:00 にちょうど 1 つのノードがジョブを実行し、12:00:10 にちょうど 1 つのノードが実行されます。毎回同じノードであるとは限りません - どのノードがそれを実行するかは多かれ少なかれランダムになります。ロード バランシング メカニズムは、ビジー状態のスケジューラ (多数のトリガー) ではランダムに近くなりますが、非ビジー状態 (1 つまたは 2 つのトリガーなど) のスケジューラーでは、ちょうどアクティブだった同じノードが優先されます。

于 2012-08-06T21:26:07.323 に答える