id:kizashi1122 です。
恥ずかしながらも最近ちゃんと理解した Sidekiq の優先度設定について書きたいと思います。
結論
ここのオフィシャルをちゃんと読みましょう。
優先度と重みの設定方法
Sidekiq のキューの設定は設定ファイルに記述することができます。
:queues: - critical - default - low
こんな感じですね。私はこれ(↑)と、これ(↓)が同じ意味だと思っていました。
:queues: - [critical, 1] - [default, 1] - [low, 1]
この2つの書き方は意味が違うんです。上の方の設定については本家の方も
This means that any job in the default queue will be processed only when the critical queue is empty.
と書いています。重みを付けていない書き方の場合は、キュー内に critical
、 default
、 low
のジョブが混在していたとしても critical
を全部捌いてから、次に default
のジョブを捌くことになります。途中で critical
のジョブが入ってこようものなら、まず critical
を捌く。あくまで指定した順番で捌いてくれるわけです。
一方、下の方の設定は、こう説明があります。
You can get random queue priorities by declaring each queue with a weight of 1, so each queue has an equal chance of being processed:
キュー内に critical
、 default
、 low
のジョブが混在していたとすると、全て同じ重みで優先度を付けずに捌いてくれます。
数字の部分が重みなわけですが、当然 1
以外の数値を指定することもできます。
:queues: - [critical, 3] - [default, 2] - [low, 1]
とすると critical
は low
の3倍の重みがついているので low
よりも3倍チェックしてくれることになります。完全に優先度をつけるわけじゃないけど、より高頻度で処理してほしい場合はこうすればよいわけですね。
本家ソースコードをみる
sidekiq/cli.rb at e7d154eeb5e237a6e6e591a3bfca0a8f7bce32f6 · mperham/sidekiq · GitHub
このあたりですかね。最終的には ops[:queues]
を作りたいわけですが、このブログの一番上の例だと
ops[:queues] = ['critical', 'default', 'low'] ops[:strict] = true
になるようですね。このブログの真ん中の例だと、
ops[:queues] = ['critical', 'default', 'low'] ops[:strict] = false
一番下の例だと
ops[:queues] = ['critical', 'critical', 'critical', 'default', 'default', 'low'] ops[:strict] = false
となると。重みの数だけ要素が増えて、読み出し側からみると参照する機会が増えるということですね。
ソースをよく読むと、「重みがない場合」や「重みにマイナスを指定した場合」なんかも理解できます。マイナスは普通しないでしょうが重みを指定しないことはあるようです。
mastodon の設定例
これは mastodon の sidekiq の設定ですが、
:queues: - [default, 6] - [push, 4] - [mailers, 2] - [pull] - [scheduler]
とあります。pull
、 scheduler
には重みがありません。
ちょっと不安になりますが、 default
や push
など重みが0より大きい設定があるので ops[:strict]
は false
になります。
重みのないキューは [nil.to_i, 1].max
で 1 になります。(nil.to_i
は 0 になります)
個人的には明示的に、
:queues: - [default, 6] - [push, 4] - [mailers, 2] - [pull, 1] - [scheduler, 1]
と書きたくなってしまいます。
要件によって、この優先度、重み設定をうまくつかいわけるとよりサービスの価値をあげることができるかもしれません。
みなさまもお試しを。
インゲージではエンジニアを募集しています。ぜひご応募を!