mcpField
S
solid-queue-coder

solid-queue-coder

github.com/majesticlabs-dev開発5048 回インストール7 週間前に更新
リポジトリ

solid-queue-coder について

Solid Queue の設定やジョブ設計を行う Rails 開発者向けのガイダンスです。データベース、キュー、並行制御、デプロイ、エラー処理に加え、Rails 8 の標準ジョブバックエンドの例と保守方法を扱います。

主な機能

  1. 01データベースとキューの設定
  2. 02ジョブ優先度と並行制御
  3. 03定期ジョブの設定
  4. 04ワーカーのデプロイ例
  5. 05リトライ、破棄、保守の指針

活用シーン

  1. 01Rails アプリでの Solid Queue 設定
  2. 02ジョブ優先度と並行上限の設定
  3. 03キューワーカーのデプロイ
  4. 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 QueueSidekiq
インフラストラクチャデータベースのみRedis が必要
ACID 保証ありなし
トランザクションによるエンキューありなし
並行処理の制御組み込みsidekiq-unique-jobs が必要

アンチパターン

アンチパターン問題解決策
本番環境でのワイルドカードキュー *優先度が予測できないキューの順序を指定する
単一のデータベースアプリケーションとの競合キュー専用のデータベースを分ける
スレッドが多すぎるデータベースの枯渇プールサイズに合わせる

出力形式

Solid Queue を設定する際は、次の内容を提示してください。

  1. データベースの設定 - マルチデータベースの設定
  2. キューの設定 - solid_queue.yml の設定
  3. ワーカーの設定 - Procfile/Docker の設定
  4. ジョブ - エラー処理を含むジョブクラスの例

コメント