0

ロギングのために特定のスケジュールされたタスクを実行するデーモンを作成していますが、特定のポイントのボトルネックが心配です。

事実上、15 分ごとに実行したいログ タスクと、30 分ごとに実行したいログ タスクがあり、月に 1 回だけ実行する必要があるタスクまであります。基本的に、各時間間隔で行うチェックのリストがあります。これらはキューに入れられ、スレッド プールによって処理されます。

現時点では、タスクがこのようなものを実行しているように見えます

15
15, 30
15, 30, 60
15, 30, 60, 120
15, 30, 60, 120, 240...

これは、デーモンが 00:00 時間に開始された場合、04:00 時間までに 5 つのプロセスが同時に実行され、これで終わりではないことを意味します。現在、これにより、15 分間に予定されている次のタスクの実行が遅くなり、制限された量の帯域幅にアクセスできます。

ただし、タスクを正時に実行する必要はありません。そのため、15 分のタスクが正時に実行される場合、重複を最小限に抑えるために、30 分のタスクは正時の 5 分に開始される場合があります。30 分の 2 つのタスク (00:00 と 00:30 など) を 15 分の 4 つのプロセスに分割して、「一度に」タイプの問題に見舞われることを減らすこともできますが、これには本当に頭が混乱します。

この種の問題を管理するためのよく知られた方法論はありますか?

4

2 に答える 2

0

まあ、長期的には(あなたの質問からわかるように)、 Quartz のようなものを探す必要があります

これとは別に、ここでいくつかの懸念事項と提案があります。

  1. [ScheduledExecutorService][2]これらのスレッドの管理に使用します。であってもScheduledExecutorService、実行時間に関係なく、別々の間隔で実行したいようです。SchedulewithFixedRateではなくScheduleWithFixedDelay

  2. このようなものを実装しても、ロジックはfail if your threads start to run on multiple hosts. 毎時スレッドを実行する 2 つのホストは、実質的に 30 分ごとに実行されます。

  3. centralized management in terms of Database私は、最後の実行とすべてを追跡することを好みます。これExecutorServiceは、スケーラブルで正確です。

1000 件のスケジュールがあるとします。DB に 1000 行を作成します。

列は多少このようになります

id, P_Key
ScheduleName, AnyIdentifier for the daemon to run or task to do.
lastRunTime, lastTime it was run.
granularity, 15 mins, 30 mins etc.

CreationTimeおよびModificationTimeをベスト プラクティスとして保持できます。

于 2012-11-02T20:38:49.803 に答える
0

Quartz、特にcronstyleトリガーを必ず確認する必要があります。

乾杯、

于 2012-10-18T07:26:55.117 に答える