ジョブキューのジョブが溜まる理由として以下のものが考えられる
- 単位時間当たりでのジョブをキューイングする量が多い
- ジョブ自体の実行時間が長い
片方の条件が成り立つ場合も両方とも成り立つこともあり得る。
高負荷時には両立することが多いだろう。
解決策としては以下のものが考えられるだろう。
- キューイングする量を減らす
- ジョブの実行時間を減らす
- ジョブのタイムアウトを設定する
- ワーカーの数を増やす
- (キューをクリアする 最終手段)
キューイングする量を減らすのは単純だけど効果ある。不必要な場所でジョブに投げてないか見直すと良い。だが、肝心のジョブ自体の実行時間が長ければ、減らしても結局たまり続ける。
内部処理にとどまるのであれば、ジョブのチューニングやワーカーの数を増やすことで何とかなる場合もあるが、ジョブ内で外部APIを叩いている時などはそうはいかない場合もある。外部要因が絡むときは敢えて一定時間でタイムアウトして再キューイング(再実行)という手を取るのが良い場合もある。
消しても良いジョブであれば、キューを消してしまうと言う荒技もある。が、これは最終手段。
溜まり続けるジョブに立ち向かうために、まずなんでジョブが溜まり続けるのかという原因を抑えた上で、適切な処置をしたい。
溜まるジョブキューシステムを目の前にして頭を整理するためにつらつら書いてみた。とりあえず、キューイングの数が少し多いのと時間がちょおかかってることは確認できた。
※ ジョブが溜まる原因としてワーカーが働いていないというのが稀にあることを付け加えておく。