概要
Resque は redis を使ったジョブキューツールで非同期処理を実現することができます
同じようなツールに Sidekiq があります
今回は Resque を単体で使いどんな感じで使うのかを試してみました
よく Resque を Rails と一緒に紹介している記事はあるのですが本記事では Rails は登場しません
環境
- macOS 11.6.5
- Ruby 3.1.1p18
- resque 2.2.1
準備
- vim Gemfile
gem "resque"
gem "rake"
- bundle install
redis 起動
- brew services start redis
Rakefile
- vim rake
require 'resque/tasks'
require './job.rb'
サンプルコード: ワーカー側
気をつけることはただ一つで self.perform
を実装します
- vim job.rb
require 'json'
class MessageJob
@queue = :default
def self.perform(msg)
sleep 10
data = {
msg: msg,
date: Time.now
}
puts data.to_json
end
end
- QUEUE=default bundle exec rake resque:work
サンプルコード: 呼び出す側
- vim app.rb
require 'resque'
require './job.rb'
Resque.enqueue(MessageJob, "Hello resque!")
- bundle exec ruby app.rb
これでワーカー側にログが流れるのが確認できると思います
最後に
結構簡単に使えました
なぜか Rails と一緒に紹介する記事ばかりだったので Resque 単体で動作させる方法を紹介しました
Sidekiq も同じような感じで使えたので実装に関してはあまり変わらないのかもしれません
あと違いがあるとすれば管理用のクラスや UI があるのかや優先度キュー、パイプライン機能、サポートしているバックグランドの種類あたりかなと思います
Tips: Pipelining commands on a Redis instance is deprecated and will be removed in Redis 5.0.0.
実行時に上記の警告が表示されます
Resque が依存している redis-namespace という gem がまだ対応していないのが原因です
参考 - https://github.com/resque/redis-namespace/issues/193
いずれ対応されると思いますが自分で対応したい場合は Redis.silence_deprecations = true
を設定すればとりあえず抑制できます
- vim job.rb
require 'json'
require 'redis'
Redis.silence_deprecations = true
class MessageJob
@queue = :default
def self.perform(msg)
sleep 3
data = {
msg: msg,
date: Time.now
}
puts data.to_json
end
end
エンキューする app.rb 側も同様です
0 件のコメント:
コメントを投稿