solid-queue-coder

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Solid 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
undefined
yaml
undefined

config/database.yml

config/database.yml

production: primary: <<: *default url: <%= ENV["DATABASE_URL"] %> queue: <<: *default url: <%= ENV["QUEUE_DATABASE_URL"] %> migrations_paths: db/queue_migrate
undefined
production: primary: <<: *default url: <%= ENV["DATABASE_URL"] %> queue: <<: *default url: <%= ENV["QUEUE_DATABASE_URL"] %> migrations_paths: db/queue_migrate
undefined

Queue Configuration

队列配置

yaml
undefined
yaml
undefined

config/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
undefined
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
undefined

Application Configuration

应用配置

ruby
undefined
ruby
undefined

config/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 } }
undefined
config.solid_queue.connects_to = { database: { writing: :queue } }
undefined

Queue 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
end
ruby
class CriticalNotificationJob < ApplicationJob
  queue_as :critical
  queue_with_priority 1  # 数值越小,优先级越高
end

class ReportGenerationJob < ApplicationJob
  queue_as :low_priority
  queue_with_priority 50
end

Concurrency 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"
end
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"
end

Recurring Jobs

定时任务

yaml
undefined
yaml
undefined

config/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
undefined
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
undefined

Deployment

部署

Procfile

Procfile配置

yaml
web: bundle exec puma -C config/puma.rb
worker: bundle exec rake solid_queue:start
yaml
web: bundle exec puma -C config/puma.rb
worker: bundle exec rake solid_queue:start

Docker Compose

Docker Compose配置

yaml
services:
  web:
    command: bundle exec puma -C config/puma.rb
  worker:
    command: bundle exec rake solid_queue:start
yaml
services:
  web:
    command: bundle exec puma -C config/puma.rb
  worker:
    command: bundle exec rake solid_queue:start

Error 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
end
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
end

Database 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
end
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
end

Solid Queue vs Sidekiq

Solid Queue vs Sidekiq

FeatureSolid QueueSidekiq
InfrastructureDatabase onlyRequires Redis
ACID guaranteesYesNo
Transactional enqueueYesNo
Concurrency controlBuilt-inRequires sidekiq-unique-jobs
特性Solid QueueSidekiq
基础设施仅需数据库需要Redis
ACID保障支持不支持
事务性入队支持不支持
并发控制内置需要sidekiq-unique-jobs插件

Anti-Patterns

反模式

Anti-PatternProblemSolution
Wildcard queue
*
in prod
Unpredictable prioritySpecify queue order
Single databaseContention with appSeparate queue database
Too many threadsDatabase exhaustionMatch pool size
反模式问题解决方案
生产环境使用通配符队列
*
优先级不可预测明确指定队列顺序
单数据库部署与应用产生资源竞争分离队列数据库
线程数量过多数据库资源耗尽匹配连接池大小

Output Format

输出格式

When configuring Solid Queue, provide:
  1. Database Setup - Multi-database configuration
  2. Queue Config - solid_queue.yml settings
  3. Worker Setup - Procfile/Docker configuration
  4. Jobs - Example job classes with error handling
配置Solid Queue时,请提供以下内容:
  1. 数据库设置 - 多数据库配置
  2. 队列配置 - solid_queue.yml设置
  3. Worker设置 - Procfile/Docker配置
  4. 任务示例 - 包含错误处理的任务类示例