概要
Sidekiq はデフォルトで default
という名前のキューを使用します
用途の異なる複数のワーカーを作成する場合にキューを指定しないとすべてのワーカーが default を見てしまい本来掴みたくないジョブを掴んでしまうことがあります
その場合はワーカーごとにキューをわけましょう
環境
- macOS 10.13.2
- Ruby 2.4.1p111
- Redis 3.2.1
- sidekiq 5.1.3
- sinatra 2.0.1
ワーカークラスでキューを指定する
これはエンキューするクライアントが参照します
当初ここに記載しておけばワーカー側も自動で参照してくれると思ったのですが、これはクライアント用の設定みたいです
require 'sidekiq'
Sidekiq.configure_server do |config|
config.redis = { 'db' => 1 }
end
class MyWorker
include Sidekiq::Worker
sidekiq_options queue: 'test_queue'
def perform(complexity)
case complexity
when 'super_hard'
sleep 20
puts 'super_hard'
when 'hard'
sleep 10
puts 'hard'
else
sleep 1
puts 'easy'
end
end
end
sidekiq_options queue: 'test_queue'
の設定を 1 行追加しているだけです
これで MyWorker.perform_async
したときに test_queue にエンキューされます
ワーカーを起動する時にキューを指定する
ワーカーは起動するときのオプションで参照するキューを指定します
bundle exec sidekiq -q test_queue -r ./worker.rb
これで default ではなく test_queue を参照するようになります
試しに redis-cli を使って確認したところちゃんと指定のキューが作成されていることがわかると思います
$ redis-cli -n 1
127.0.0.1:6379[1]> SMEMBERS queues
1) "test_queue"
最後に
Sidekiq でキューを指定してワーカーを動作させる方法を紹介しました
ワーカーを起動する時にオプションが必要になるのがポイントでしょうか
もう一つ方法として namespace を使う方法もあるらしいですがこれはまた別の方法かなと思います
新たにキューを作成するわけではなく更に上位の概念で分割しようという機能だと思います
また、namespace を使う場合には redis-namespace
という gem も必要になります
0 件のコメント:
コメントを投稿