🎃

Resqueを使って非同期のJobを実行する

2024/04/24に公開

Railsのバックグランドのジョブを実行するサービスのResqueについて、理解するために触ってみたのでメモとして残しておきます。

Railsでバックグラウンドのジョブを扱うサービス

具体的なResqueの使い方を見ていく前に、Railsでバックグランドのジョブを扱うサービスとして代表的な、SidekiqResqueの比較を記載します。

サービス ストレージ 特徴
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

参考

https://zenn.dev/shima_zu/articles/rails_active_job

https://qiita.com/zaru/items/8385fdddbd1be25fe370

https://tech.andpad.co.jp/entry/2020/03/16/073129

Discussion