多数のジョブを同時に実行すると、バックエンドシステムが過負荷になり、リソース枯渇や実行失敗を引き起こす可能性があります。SchedulerX for XXL-JOB では、ジョブの同時実行数を制御するための 2 つのレベルの速度制限機能を提供しています。
ジョブレベルの速度制限:単一のジョブについて、同時に実行できるインスタンス数を制限します。べき等性のある実行を保証したり、ジョブごとの並列度を上限で制御したりする場合に使用します。
アプリケーションレベルの速度制限:アプリケーション全体で同時に実行されるジョブの総数を制限します。数百のジョブが同時にトリガーされ、バックエンドがその負荷に対応できない場合に使用します。
| シナリオ | 速度制限レベル | 構成内容 |
|---|---|---|
| 長時間実行されるジョブの重複実行を防止する | ジョブレベル | タスク同時実行数 を 1 |
| 単一ジョブに対して限定的な並列実行を許可する | ジョブレベル | タスク同時実行数 を希望する上限値に設定します |
| 多数のジョブが同時にトリガーされた際にバックエンドの過負荷を防止する | アプリケーションレベル | フロー制御 を有効にして、タスク実行キュー サイズ |
| 優先度の高いジョブを緊急性の低いジョブよりも優先して実行する | アプリケーションレベル | フロー制御 を有効にして、ジョブに優先度を割り当てます |
ジョブレベルの速度制限の仕組み
オープンソース版 XXL-JOB にはクライアントレベルで速度制限を行うブロッキング戦略が含まれています。この方式は単一のエグゼキュータ上でジョブをシリアルに実行しますが、複数のエグゼキュータが登録されている場合、グローバルなべき等性を保証できません。2 つのエグゼキュータが同時に同じジョブを取得してしまう可能性があります。
SchedulerX for XXL-JOB では、複数のエグゼキュータが構成されていてもグローバルなジョブのべき等性を保証するジョブレベルの速度制限をサポートすることで、この問題を解決しています。
実行時の動作:ジョブの実行が次のスケジューリング時刻まで継続している場合、次のスケジューリングはスキップされます。
ジョブレベルの速度制限の構成
SchedulerX for XXL-JOB コンソール にログインします。
ターゲットインスタンスを検索し、その ID をクリックします。
左側のナビゲーションウィンドウで、タスク管理 をクリックします。
対象のジョブを検索し、操作 列の 編集 をクリックします。
基本構成ステップの 詳細設定 セクションで、タスク同時実行数 パラメーターを設定します。

タスク同時実行数 は、単一ジョブの最大同時実行数を制御します。
| 値 | 動作 |
|---|---|
| 1 | べき等性のある実行を強制します。次のトリガー時にジョブがまだ実行中の場合、新しい実行はスキップされます。 |
| N(1 より大きい) | 同一ジョブの最大 N 個までの並列実行を許可します。 |
アプリケーションレベルの速度制限の仕組み
アプリケーション内に多数のジョブが同時にトリガーされる場合、バックエンドが過負荷になることがあります。たとえば、データプラットフォームアプリケーションには前日のオフラインデータを処理する数百のバッチジョブがあり、すべてのジョブが 00:30:00 に開始され、09:30 までに完了する必要があります。これらを一度にトリガーすると、バックエンドがクラッシュする可能性があります。
アプリケーションレベルの速度制限は、キューイングメカニズムとプリエンプティブスケジューリングにより、この問題に対処します。
構成可能なキューにより、アプリケーション全体での同時実行ジョブ数が制限されます。
超過したジョブはバックエンドを圧迫することなく、キュー内で待機します。
優先度の高いジョブが優先度の低いジョブをプリエンプトするため、重要なデータパイプラインが最初に完了します。
実行時の動作:タスク実行キュー サイズ の上限に達すると、新たにトリガーされたジョブは待機キューに格納されます。実行中のジョブが完了してスロットが空くと、待機キュー内で最も優先度の高いジョブが次にディスパッチされます。
アプリケーションレベルの速度制限の構成
SchedulerX for XXL-JOB コンソール にログインします。
ターゲットインスタンスを検索し、その ID をクリックします。
アプリケーション管理 ページで、対象のアプリケーションを検索し、操作 列の 編集 をクリックします。
詳細設定 セクションで、フロー制御 を有効にします。
タスク実行キュー サイズ パラメーターを設定します。

たとえば、タスク実行キュー サイズ を 10 に設定すると、最大 10 個のジョブを同時に実行できます。それ以上のジョブがトリガーされた場合は、待機キューに格納されます。
ジョブの優先度の割り当て
アプリケーションレベルの速度制限を有効にした後は、キュー内の実行順序を制御するために各ジョブに優先度を割り当てます。
優先度の高いジョブは優先度の低いジョブをプリエンプトします。スロットが空いた際には、待機キュー内で最も優先度の高いジョブが最初にディスパッチされます。