ワーカー使っていると、一部のジョブだけちょっと優先的に実行したいということがあるので、TheSchwartz の場合、prioritize => 1 にしてプライオリティを有効にするとよいのですが、挙動でハマったのでメモをしておきます。

今回のケース

そもそもジョブごとにプライオリティはつけていないが、一部のジョブだけ手動対応で優先して処理を行いたくなった。

やったこと

該当ジョブを

update job set run_after = insert_time, grabbed_until = insert_time, priority = 1 where ...;

で優先順位を設定しすぐに実行開始できるようにした

結果

_人人人人人人人人人人人人_
> なかなか実行されない <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

というのも、TheSchwartz は priority 順でソートして50件取得して、それをシャッフルしてから1件選んで実行する、という挙動をするため。

つまり、優先順位を設定したとしても有象無象と混ぜられた 1/50 のクジに当たらなければ、そのジョブは実行されない。1/50 って2%だよ…… 2%…… 100回ジョブ実行しようとしてようやく86.7%の確率だよ……


どうするか?

とにかく入ってるジョブをすぐ実行したい場合

  • $TheSchwartz::FIND_JOB_BATCH_SIZE (デフォルト50) を 1 にする
  • 該当ジョブ以外の run_after を適当に未来に設定する
  • ジョブIDを指定して1回だけワークするスクリプト書いて手動実行

ぐらいしかない。

  1. トップ
  2. tech
  3. TheSchwartz の prioritize を有効にしたときの挙動は愉快
  1. トップ
  2. perl
  3. TheSchwartz の prioritize を有効にしたときの挙動は愉快