Rails 8 では、Active Job のキュー基盤として Solid Queue が標準で使えるようになっています。
Redis など別のミドルウェアを用意しなくても、データベースベースで非同期ジョブを扱えるので、以前より導入しやすくなった印象です。
今回は、Rails 8 で Solid Queue を使って簡単なジョブを動かすところまでをメモしておきます。
Solid Queueとは
Solid Queue は、Rails 8 以降で標準採用されているデータベース駆動型のキューイング基盤です。
通常のジョブ実行だけでなく、遅延実行、優先度、並行制御などにも対応しています。
「まずはRails標準の仕組みで非同期処理を試したい」という時にはかなり使いやすいです。
基本設定
環境設定で、Active Job のアダプタを Solid Queue にします。
config.active_job.queue_adapter = :solid_queue
さらに、Solid Queue 用のDB接続設定を入れます。
config.solid_queue.connects_to = { database: { writing: :queue } }
database.yml 側では、queue 用の接続を定義しておきます。
このあたりは既存アプリの構成によって変わるので、プロジェクトに合わせて調整します。
テーブルを準備する
設定を書いたら、まずはDB準備です。
bin/rails db:prepare
これで、Solid Queue が利用するテーブル群も含めて準備できます。
ジョブを作る
たとえば、こんなシンプルなジョブを作ります。
class SampleJob < ApplicationJob
queue_as :default
def perform(name)
Rails.logger.info "Hello, #{name}"
end
end
呼び出しは以下でOKです。
SampleJob.perform_later("Taro")
これでジョブがキューに積まれます。
ジョブを実行する
キューを実際に処理するには、ジョブプロセスを起動します。
bin/jobs start
ジョブを enqueue しただけでは即時実行されず、処理プロセスが動いてはじめて消化されるので、ここは忘れやすいポイントです。
まとめ
Rails 8 で非同期処理を始めるなら、まず Solid Queue を素直に使ってみるのがわかりやすいです。
Redis を別途用意しなくてもスタートしやすいので、小〜中規模のアプリではかなり扱いやすいと思います。
とりあえず最小構成で試すなら、以下の流れだけ覚えておけばOKです。
config.active_job.queue_adapter = :solid_queuebin/rails db:prepareSampleJob.perform_later(...)bin/jobs start
Rails 標準寄りで組みたい人には、かなり相性がいいと思います。
