关于 solid-queue-coder
为 Rails 开发者提供 Solid Queue 配置与作业设计指导,涵盖数据库、队列、并发、部署和错误处理。内容包括 Rails 8 默认作业后端的示例及维护建议。
主要功能
- 01数据库与队列配置
- 02作业优先级和并发控制
- 03周期性作业配置
- 04Worker 部署示例
- 05重试、丢弃与维护指导
适用场景
- 01配置 Rails 应用的 Solid Queue
- 02为作业设置优先级与并发限制
- 03部署队列 Worker
- 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 Queue | Sidekiq |
|---|---|---|
| 基础设施 | 仅数据库 | 需要 Redis |
| ACID 保证 | 是 | 否 |
| 事务性入队 | 是 | 否 |
| 并发控制 | 内置 | 需要 sidekiq-unique-jobs |
反模式
| 反模式 | 问题 | 解决方案 |
|---|---|---|
生产环境使用通配符队列 * | 优先级不可预测 | 指定队列顺序 |
| 使用单一数据库 | 与应用争抢资源 | 使用独立的队列数据库 |
| 线程过多 | 数据库资源耗尽 | 与连接池大小匹配 |
输出格式
配置 Solid Queue 时,请提供:
- 数据库设置 - 多数据库配置
- 队列配置 - solid_queue.yml 设置
- Worker 设置 - Procfile/Docker 配置
- 作业 - 包含错误处理的作业类示例
评论
支持 Markdown