solid-queue-coder
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSolid Queue Coder
Solid Queue 配置指南
Overview
概述
Solid Queue is Rails 8's default job backend—a database-backed Active Job adapter that eliminates the need for Redis. Jobs are stored in your database with ACID guarantees.
Solid Queue是Rails 8的默认任务后端——一个基于数据库的Active Job适配器,无需依赖Redis。任务会存储在数据库中,具备ACID保障。
Configuration
配置
Database Setup
数据库设置
yaml
undefinedyaml
undefinedconfig/database.yml
config/database.yml
production:
primary:
<<: *default
url: <%= ENV["DATABASE_URL"] %>
queue:
<<: *default
url: <%= ENV["QUEUE_DATABASE_URL"] %>
migrations_paths: db/queue_migrate
undefinedproduction:
primary:
<<: *default
url: <%= ENV["DATABASE_URL"] %>
queue:
<<: *default
url: <%= ENV["QUEUE_DATABASE_URL"] %>
migrations_paths: db/queue_migrate
undefinedQueue Configuration
队列配置
yaml
undefinedyaml
undefinedconfig/solid_queue.yml
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
undefinedproduction:
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
undefinedApplication Configuration
应用配置
ruby
undefinedruby
undefinedconfig/application.rb
config/application.rb
config.active_job.queue_adapter = :solid_queue
config.active_job.queue_adapter = :solid_queue
config/environments/production.rb
config/environments/production.rb
config.solid_queue.connects_to = { database: { writing: :queue } }
undefinedconfig.solid_queue.connects_to = { database: { writing: :queue } }
undefinedQueue Design
队列设计
Priority Strategy
优先级策略
ruby
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
endruby
class CriticalNotificationJob < ApplicationJob
queue_as :critical
queue_with_priority 1 # 数值越小,优先级越高
end
class ReportGenerationJob < ApplicationJob
queue_as :low_priority
queue_with_priority 50
endConcurrency Control
并发控制
ruby
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"
endruby
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"
endRecurring Jobs
定时任务
yaml
undefinedyaml
undefinedconfig/solid_queue.yml
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
undefinedrecurring:
cleanup_old_records:
class: CleanupJob
schedule: every day at 3am
queue: low_priority
sync_external_data:
class: SyncExternalDataJob
schedule: every 15 minutes
queue: default
undefinedDeployment
部署
Procfile
Procfile配置
yaml
web: bundle exec puma -C config/puma.rb
worker: bundle exec rake solid_queue:startyaml
web: bundle exec puma -C config/puma.rb
worker: bundle exec rake solid_queue:startDocker Compose
Docker Compose配置
yaml
services:
web:
command: bundle exec puma -C config/puma.rb
worker:
command: bundle exec rake solid_queue:startyaml
services:
web:
command: bundle exec puma -C config/puma.rb
worker:
command: bundle exec rake solid_queue:startError Handling
错误处理
ruby
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
endruby
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
endDatabase Maintenance
数据库维护
ruby
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
endruby
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
endSolid Queue vs Sidekiq
Solid Queue vs Sidekiq
| Feature | Solid Queue | Sidekiq |
|---|---|---|
| Infrastructure | Database only | Requires Redis |
| ACID guarantees | Yes | No |
| Transactional enqueue | Yes | No |
| Concurrency control | Built-in | Requires sidekiq-unique-jobs |
| 特性 | Solid Queue | Sidekiq |
|---|---|---|
| 基础设施 | 仅需数据库 | 需要Redis |
| ACID保障 | 支持 | 不支持 |
| 事务性入队 | 支持 | 不支持 |
| 并发控制 | 内置 | 需要sidekiq-unique-jobs插件 |
Anti-Patterns
反模式
| Anti-Pattern | Problem | Solution |
|---|---|---|
Wildcard queue | Unpredictable priority | Specify queue order |
| Single database | Contention with app | Separate queue database |
| Too many threads | Database exhaustion | Match pool size |
| 反模式 | 问题 | 解决方案 |
|---|---|---|
生产环境使用通配符队列 | 优先级不可预测 | 明确指定队列顺序 |
| 单数据库部署 | 与应用产生资源竞争 | 分离队列数据库 |
| 线程数量过多 | 数据库资源耗尽 | 匹配连接池大小 |
Output Format
输出格式
When configuring Solid Queue, provide:
- Database Setup - Multi-database configuration
- Queue Config - solid_queue.yml settings
- Worker Setup - Procfile/Docker configuration
- Jobs - Example job classes with error handling
配置Solid Queue时,请提供以下内容:
- 数据库设置 - 多数据库配置
- 队列配置 - solid_queue.yml设置
- Worker设置 - Procfile/Docker配置
- 任务示例 - 包含错误处理的任务类示例