Quartzスケジューラが1秒間に実行できるジョブの数には制限があるようです。このシナリオでは、1秒あたり約20のジョブが24時間365日起動し、クォーツは1秒あたり最大10のジョブ(JDBCがサポートするJobStoreの場合は100のクォーツスレッドと100のデータベース接続プールサイズ)で正常に機能しましたが、20に増やすと1秒あたりのジョブ数が非常に遅くなり、トリガーされたジョブが実際のスケジュールされた時間に比べて非常に遅くなり、多くの失火が発生し、最終的にシステムの全体的なパフォーマンスが大幅に低下します。興味深い事実の1つはJobExecutionContext.getScheduledFireTime().getTime()
、このような遅延トリガーの場合、スケジュール時刻から10〜20分、さらにはそれ以上になることです。
クォーツスケジューラーがジョブのスケジュールされた時間に影響を与えることなく1秒間に実行できるジョブの数と、そのような負荷に最適なクォーツスレッドの数はいくつですか?
それとも私はここで何かが欠けていますか?
達成したいことの詳細:
ほぼ1万個のアイテム(2つ以上のカテゴリに分類され、現在は2つのカテゴリがあります)があり、15、30、60 ...分の特定の頻度で処理する必要があり、これらのアイテムはその頻度で処理する必要があります1分あたりの特定のスロットルで。たとえば、60分間の頻度で、各カテゴリの5kアイテムは、1分あたり500アイテムのスロットルで処理する必要があるとします。したがって、理想的には、これらのアイテムは1日の各時間の最初の10(5000/500)分以内に処理され、1分ごとに500個のアイテムが処理され、1分ごとに1秒ごとに均等に分散されるため、約8分になります。 1つのカテゴリで1秒あたり9アイテム。
これを実現するために、これらのアイテムを処理するためのジョブをトリガーするスケジューラーとしてQuartzを使用しました。ただし、Job.executeメソッドで各アイテムを処理することはありません。これは、Webサービス呼び出しを含むアイテム処理ごとに5〜50秒(平均30秒)かかるためです。むしろ、 JMSキューで処理するアイテムごとにメッセージをプッシュし、別々のサーバーマシンがそれらのジョブを処理します。Job.executeメソッドにかかる時間が30ミリ秒を超えないことに気づきました。
サーバーの詳細:
Solaris Sparc 64ビットサーバー(8/16コア/スレッドCPU)、16GB RAMのスケジューラー用。スケジューラークラスターには、このようなマシンが2台あります。