2022年4月21日木曜日

Ruby Resque 超入門 (Rails なし)

Ruby Resque 超入門 (Rails なし)

概要

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 件のコメント:

コメントを投稿