Solid Queue

· Padrão API
Juan Kalleo
Juan Kalleo
Backend/API
This page hasn't been translated to English yet — showing the original Portuguese content.

O que é

Backend de job assíncrono do próprio Rails (padrão a partir do Rails 8) — fila e agendamento gravados no banco relacional já existente, sem precisar de um serviço separado (Redis, por exemplo) só pra isso.

Por que essa (não Sidekiq/good_job)

A escolha real aqui nem foi "comparar gems" — é o default do Rails 8, e o projeto não trouxe nada por cima pra substituir. Sidekiq (o mais popular do ecossistema) exige Redis rodando à parte; good_job também é DB-backed, como o Solid Queue, mas é uma gem de terceiro, não o default oficial do framework. Pra um projeto que já roda Postgres e não tem volume de job que justifique um serviço de fila dedicado, usar o que já vem integrado (mesmo banco, mesma conexão, zero peça nova de infraestrutura pra operar) é a escolha de menor atrito — trocar por Sidekiq só faria sentido se o volume de job crescesse a ponto do polling em banco virar gargalo real, o que ainda não é o caso aqui.

Versão

solid_queue (1.5.1)Gemfile.lock.

Como importar

# Gemfile
gem "solid_queue"
# config/queue.yml
default: &default
  dispatchers:
    - polling_interval: 1
      batch_size: 500
  workers:
    - queues: "*"
      threads: 3
      processes: <%= ENV.fetch("JOB_CONCURRENCY", 1) %>
      polling_interval: 1

Exemplo real

# app/jobs/application_job.rb — a base, ainda no estado padrão do Rails
class ApplicationJob < ActiveJob::Base
  # retry_on ActiveRecord::Deadlocked
  # discard_on ActiveJob::DeserializationError
end

Configurado e pronto pra uso — queue.yml já define worker/dispatcher pros três ambientes — mas nenhum job próprio foi escrito ainda no projeto (app/jobs/ só tem a classe base gerada pelo Rails). Um job real seguiria o padrão comum do ActiveJob:

class NotificarAlgoJob < ApplicationJob
  queue_as :default

  def perform(usuario_id)
    # ...
  end
end

Onde usar no projeto

Ainda não tem consumidor real — infraestrutura pronta pra quando aparecer o primeiro caso de uso genuíno de trabalho assíncrono (envio de e-mail em lote, geração de relatório pesado fora do ciclo de request/response, etc.), sem precisar de setup novo quando isso acontecer.