mcpField
S
solid-queue-coder

solid-queue-coder

github.com/majesticlabs-dev开发5048 次安装7 周前更新
代码仓库

关于 solid-queue-coder

为 Rails 开发者提供 Solid Queue 配置与作业设计指导,涵盖数据库、队列、并发、部署和错误处理。内容包括 Rails 8 默认作业后端的示例及维护建议。

主要功能

  1. 01数据库与队列配置
  2. 02作业优先级和并发控制
  3. 03周期性作业配置
  4. 04Worker 部署示例
  5. 05重试、丢弃与维护指导

适用场景

  1. 01配置 Rails 应用的 Solid Queue
  2. 02为作业设置优先级与并发限制
  3. 03部署队列 Worker
  4. 04规划作业错误处理和数据库维护

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/majesticlabs-dev/majestic-marketplace --skill solid-queue-coder

安装后在 Claude Code 中输入/solid-queue-coder确认已加载。

详细介绍

Solid Queue 编码器

概述

Solid Queue 是 Rails 8 的默认作业后端——一种基于数据库的 Active Job 适配器,无需使用 Redis。作业存储在数据库中,并享有 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. Worker 设置 - Procfile/Docker 配置
  4. 作业 - 包含错误处理的作业类示例

评论

支持 Markdown