Category guides

Background jobs in Rails: Solid Queue, Sidekiq, GoodJob and older options

Category guides · · Published 2026-10-24

A curving roller conveyor in a factory hall
A curving roller conveyor in a factory.

Sending email, resizing images, calling slow APIs: anything that should not happen during a web request belongs in a background job. Rails provides the interface; the backend that actually stores and runs jobs is your choice.

Release figures are from RubyGems.org, October 2026.

Active Job: the common interface

Since Rails 4.2, Active Job has provided a standard API for declaring and enqueuing jobs:

class ReceiptJob < ApplicationJob
  queue_as :mailers
  retry_on Net::OpenTimeout, wait: :polynomially_longer, attempts: 5

  def perform(order)
    OrderMailer.receipt(order).deliver_now
  end
end

ReceiptJob.perform_later(order)

Arguments such as order are serialised with GlobalID, so the job receives a fresh record from the database rather than a stale copy. Retries, discards, callbacks and scheduling (set(wait: 10.minutes)) are part of the framework. The Active Job Basics guide documents the API and the list of adapters.

Writing jobs against Active Job keeps you free to change backends later. Some backends also offer a native API with extra features; using it ties your code to that backend, which can be worth it.

Solid Queue

Solid Queue (1.7.0, August 2026) is the default Active Job backend for new Rails 8 applications. It stores jobs in a relational database (PostgreSQL, MySQL or SQLite) and relies on FOR UPDATE SKIP LOCKED where the database supports it, so several workers can poll the same tables without blocking one another. It supports delayed jobs, recurring tasks declared in config/recurring.yml, concurrency limits per job, queue priorities and pausing queues.

The Rails 8 default configuration keeps the queue in a separate database, and Solid Queue can run inside the Puma process through a plugin, which is convenient for small deployments with a single server. The Mission Control – Jobs engine adds a web dashboard for inspecting, retrying and discarding jobs.

Choose it when you want no extra infrastructure: no Redis, one less service to monitor. Its throughput is lower than a Redis-based system, but more than enough for most applications.

Sidekiq

Sidekiq (8.1.7, August 2026) runs jobs in threads inside a long-lived process and stores them in Redis or a Redis-compatible server. It has been the performance reference for Ruby background processing for over a decade and has a mature web UI, extensive middleware and a large ecosystem of extensions.

The open-source edition is licensed under LGPL-3.0. Sidekiq Pro and Sidekiq Enterprise are commercial editions that add features such as batches, more reliable fetching, rate limiting, unique jobs and periodic jobs; check the project's own feature comparison for the current split.

Because Sidekiq is multi-threaded, your job code and the gems it calls must be thread-safe, which was far from guaranteed for gems of the Rails 2 era. Today most popular gems are thread-safe, since Puma has made threaded Rails servers the norm.

Choose it when you process large volumes of jobs, already run Redis, or need its commercial features.

GoodJob

GoodJob (4.22.1, October 2026) is a PostgreSQL-only backend built for Active Job. It uses advisory locks to claim jobs and LISTEN/NOTIFY to wake workers immediately, and includes a dashboard engine, cron-style recurring jobs, batches and concurrency controls. It can run in a separate process or asynchronously inside the web server process.

Choose it when you are committed to PostgreSQL and want a database-backed queue with a long track record and rich features. Applications that adopted GoodJob before Solid Queue existed have little reason to switch.

delayed_job and Resque

delayed_job stores jobs in a database table and dates back to the Rails 2 era; it is still released (4.2.0, December 2025) and widely deployed. Resque uses Redis and forks a child process per job, which isolates memory leaks at the cost of speed; it too is still released (3.2.0, October 2026). Both are reasonable to keep in an existing application. For a new one, Solid Queue covers delayed_job's niche and Sidekiq covers most of Resque's.

What happened to Workling, Spawn and BackgrounDRb

Before Active Job, Rails 2 applications used a variety of plugins. Workling provided a common interface over several queue servers (Starling, RabbitMQ and others), an idea that Active Job later standardised; its last gem release is from December 2010. Spawn let a controller fork a process or start a thread to finish slow work after the response; it was popular for its simplicity, and it is the kind of solution a proper queue replaced, because forked work vanished when the process died and could not be retried. BackgrounDRb ran workers over DRb. None of these is maintained, and none should be used today.

Practical advice, whichever backend you choose

Calls to rate-limited external services are a classic use. In the comparison of geocoding gems for a Rails apartment search, addresses are geocoded in a job on a single-worker queue to respect the provider's one-request-per-second limit, and slow file processing follows the same pattern with your file upload library of choice.

Summary

BackendStorageNotes
Solid QueuePostgreSQL, MySQL, SQLiteRails 8 default; Mission Control dashboard
SidekiqRedis-compatibleHighest throughput; commercial editions
GoodJobPostgreSQLBuilt-in dashboard, cron, batches
delayed_jobDatabaseLong-lived, still released
ResqueRedisForks per job; still released