🎃
Resqueを使って非同期のJobを実行する
Railsのバックグランドのジョブを実行するサービスのResqueについて、理解するために触ってみたのでメモとして残しておきます。
Railsでバックグラウンドのジョブを扱うサービス
具体的なResqueの使い方を見ていく前に、Railsでバックグランドのジョブを扱うサービスとして代表的な、SidekiqとResqueの比較を記載します。
サービス | ストレージ | 特徴 |
---|---|---|
Sidekiq | Redis | ・マルチスレッド ・大量のJob処理に向いている |
Resque | Redis | ・シングルスレッド ・大量のJob処理をしようとするとオーバーヘッドが大 |
Resqueを使ってみる
gemを追加
Gemfileに以下を追記してbundle install
を実行。
Gemfile
gem 'resque'
ジョブを書く
ワーカーに実行させたい処理を、jobsディレクトリの中に記載します。
引数でnameを受け取って、文字列で出力するシンプルなジョブを作成しました。
@queue
の部分はキューの名前を自由に指定できます。
app/jobs/example_job.rb
class ExampleJob
@queue = :default
def self.perform(name)
p "Hello #{name}"
end
end
ワーカーを起動する
キューを監視する役割を持つワーカーを起動します。
上の例で、defaultという名前のキューを設定したので、QUEUE
の部分で指定します。
QUEUE=default rake resque:work
※全てのキューを監視したい場合はQUEUE=*
のようにワイルドカードが使えます。
キューにデータを登録する
rails c
でRailsのコンソールに入った上で、以下を実行します。
Resque.enqueue(ExampleJob, "hisamitsu")
結果
ワーカーを起動したコンソールで、以下のように表示されていれば成功です。
"Hello hisamitsu"
Active Jobとの関係
Railsでバックグラウンドのジョブを動かす機能として、Active Jobがあります。
これ単体でも、上記のような非同期でのジョブの実行を行うことはできますが、Active JobはキューをRailsのメモリ内に保持するため、Railsを再起動するとジョブは失われてしまいます。
なので、キューを保持しようとすると、上記で紹介した、ResqueやSidekiqなどのキューイングライブラリが必要となります。
また、Active Jobは以下のように、使用するキューイングライブラリを簡単に設定でき、ここさえ設定すればどのライブラリを使っていても、共通の書き方で実装できます。
application.rb
module ActiveJobPractice
class Application < Rails::Application
...
config.active_job.queue_adapter = :resque
...
end
end
参考
Discussion