solid-queue-coder について
Solid Queue の設定やジョブ設計を行う Rails 開発者向けのガイダンスです。データベース、キュー、並行制御、デプロイ、エラー処理に加え、Rails 8 の標準ジョブバックエンドの例と保守方法を扱います。
主な機能
- 01データベースとキューの設定
- 02ジョブ優先度と並行制御
- 03定期ジョブの設定
- 04ワーカーのデプロイ例
- 05リトライ、破棄、保守の指針
活用シーン
- 01Rails アプリでの Solid Queue 設定
- 02ジョブ優先度と並行上限の設定
- 03キューワーカーのデプロイ
- 04ジョブのエラー処理とデータベース保守の計画
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ majesticlabs-dev/ majestic-marketplace --skill solid-queue-coderインストール後、Claude Code で/solid-queue-coderを入力して読み込まれたか確認します。
詳細
Solid Queue Coder
概要
Solid Queue は Rails 8 のデフォルトのジョブバックエンドです。Redis を必要としない、データベースを基盤とする Active Job アダプターです。ジョブは ACID 保証のもと、データベースに保存されます。
設定
データベースの設定
# config/database.yml
production:
primary:
<<: *default
url: <%= ENV["DATABASE_URL"] %>
queue:
<<: *default
url: <%= ENV["QUEUE_DATABASE_URL"] %>
migrations_paths: db/queue_migrate
キューの設定
# config/solid_queue.yml
production:
dispatchers:
- polling_interval: 1
batch_size: 500
workers:
- queues: [critical, default]
threads: 5
processes: 2
polling_interval: 0.1
- queues: [low_priority]
threads: 2
processes: 1
polling_interval: 1
アプリケーションの設定
# config/application.rb
config.active_job.queue_adapter = :solid_queue
# config/environments/production.rb
config.solid_queue.connects_to = { database: { writing: :queue } }
キュー設計
優先度の戦略
class CriticalNotificationJob < ApplicationJob
queue_as :critical
queue_with_priority 1 # Lower = higher priority
end
class ReportGenerationJob < ApplicationJob
queue_as :low_priority
queue_with_priority 50
end
並行処理の制御
class ProcessUserDataJob < ApplicationJob
limits_concurrency key: ->(user_id) { user_id }
end
class SyncContactJob < ApplicationJob
limits_concurrency key: ->(contact) { contact.id },
duration: 15.minutes,
group: "ContactOperations"
end
定期実行ジョブ
# config/solid_queue.yml
recurring:
cleanup_old_records:
class: CleanupJob
schedule: every day at 3am
queue: low_priority
sync_external_data:
class: SyncExternalDataJob
schedule: every 15 minutes
queue: default
デプロイ
Procfile
web: bundle exec puma -C config/puma.rb
worker: bundle exec rake solid_queue:start
Docker Compose
services:
web:
command: bundle exec puma -C config/puma.rb
worker:
command: bundle exec rake solid_queue:start
エラー処理
class ExternalApiJob < ApplicationJob
retry_on Net::OpenTimeout, wait: :polynomially_longer, attempts: 5
discard_on ActiveJob::DeserializationError
rescue_from StandardError do |exception|
if executions >= 5
FailedJob.create!(job_class: self.class.name, error_message: exception.message)
else
raise exception
end
end
end
データベースのメンテナンス
namespace :queue do
task vacuum: :environment do
ActiveRecord::Base.connected_to(database: :queue) do
%w[solid_queue_ready_executions solid_queue_claimed_executions].each do |table|
ActiveRecord::Base.connection.execute("VACUUM ANALYZE #{table}")
end
end
end
end
Solid Queue と Sidekiq の比較
| 機能 | Solid Queue | Sidekiq |
|---|---|---|
| インフラストラクチャ | データベースのみ | Redis が必要 |
| ACID 保証 | あり | なし |
| トランザクションによるエンキュー | あり | なし |
| 並行処理の制御 | 組み込み | sidekiq-unique-jobs が必要 |
アンチパターン
| アンチパターン | 問題 | 解決策 |
|---|---|---|
本番環境でのワイルドカードキュー * | 優先度が予測できない | キューの順序を指定する |
| 単一のデータベース | アプリケーションとの競合 | キュー専用のデータベースを分ける |
| スレッドが多すぎる | データベースの枯渇 | プールサイズに合わせる |
出力形式
Solid Queue を設定する際は、次の内容を提示してください。
- データベースの設定 - マルチデータベースの設定
- キューの設定 - solid_queue.yml の設定
- ワーカーの設定 - Procfile/Docker の設定
- ジョブ - エラー処理を含むジョブクラスの例
コメント
Markdown 対応