Sidekiq ジョブをキューの先頭に追加するにはどうすればよいですか?
概要
Sidekiq ジョブをキューの先頭に追加するにはどうすればよいですか?
あなたが今言いたい最も明白な事は、「別のワーカーを使用して別の高プリオキューを追加すればいいだけです!」ということだと思いますが、リソースには制約があるので、追加のワーカーは問題外です。
さて、技術的には、Sidekiq が Redis のキューの先頭にジョブを追加し、リストの末尾からジョブをポップして、処理する次のジョブを取得することがわかりました (これは多少直感に反しますが、問題ありません)。場合によっては、終了時に未完了のジョブを保持するために、実際に必要なことを実行します。つまり、ジョブをリストの最後に再度キューに入れます (== 次にプルされます)。結局のところ、次のフェッチで実行されるようにジョブをキューの先頭に追加する (厳密には「追加」する) 方法を知っている人はいますか?もちろん、Sidekiq ソースに過度のモンキーパッチを適用する必要はありません。それとも、すでにそれを行う宝石を誰かが知っているのでしょうか?…
解決策
追加のワーカーは必要なく、2 番目のキューを設定するだけで済みます。単一スレッドを持つ単一の Sidekiq プロセスでも、複数のキューを処理できます。
Sidekiq キューは、指定された順序 (または重みに従って、詳細オプション - キューを参照) で処理されます。
この単純な構成を考えると、次のようになります。
:queues:
- critical
- default
利用可能な Sidekiq ワーカーは、最初にクリティカル キューからジョブをフェッチしようとし、空の場合は次にデフォルト キューからジョブをフェッチしようとします。
デフォルト キューに 3 つのジョブがあり、クリティカル キューにはジョブがないとします。
critical: []
default: [job_1, job_2, job_3]
…次に使用可能なワーカーは、最初に job_1 を処理し、次に job_2 を処理し、最後に job_3 を処理します。
別のジョブをクリティカルにプッシュすると、次のようになります。
critical: [job_4]
default: [job_1, job_2, job_3]
… 次に利用可能なワーカーは、最初に job_4 を処理し、次に job_1、job_2、および job_3 を処理します。