sidekiq の優先度設定

https://sidekiq.org/assets/2018/horizontal.svg

id:kizashi1122 です。
恥ずかしながらも最近ちゃんと理解した Sidekiq の優先度設定について書きたいと思います。

結論

github.com

ここのオフィシャルをちゃんと読みましょう。

優先度と重みの設定方法

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.

と書いています。重みを付けていない書き方の場合は、キュー内に criticaldefaultlow のジョブが混在していたとしても 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:

キュー内に criticaldefaultlow のジョブが混在していたとすると、全て同じ重みで優先度を付けずに捌いてくれます。
数字の部分が重みなわけですが、当然 1 以外の数値を指定することもできます。

:queues:
  - [critical, 3]
  - [default, 2]
  - [low, 1]

とすると criticallow の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 の設定例

github.com

これは mastodon の sidekiq の設定ですが、

:queues:
  - [default, 6]
  - [push, 4]
  - [mailers, 2]
  - [pull]
  - [scheduler]

とあります。pullscheduler には重みがありません。
ちょっと不安になりますが、 defaultpush など重みが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]

と書きたくなってしまいます。

要件によって、この優先度、重み設定をうまくつかいわけるとよりサービスの価値をあげることができるかもしれません。

みなさまもお試しを。

インゲージではエンジニアを募集しています。ぜひご応募を!

採用情報 – 株式会社インゲージ