April 10, 2024

Sidekiq en Heroku

Guía básica para agregar Sidekiq a tu proyecto de Ruby on Rails alojado en Heroku

Esta pequeña guía te ayudará a instalar y a configurar Redis + Sidekiq para usarlo en tu aplicación web alojada en Heroku.

Lo primero que se tiene que realizar en las configuraciones de Heroku es instalar Redis. Afortunadamente ya hay Add-ons que realizan todo el trabajo por ti. Una de las opciones disponibles es Redis To Go.

Si decides utilizar Redis To Go, lo único que tendrás que hacer es seleccionar el plan que se acomode a las necesidades de tu proyecto y asegurarte que el aprovisionamiento es en la aplicación en la que quieres usar Sidekiq.

Después de la instalación podrás notar que el Add-on ya realizó todas las configuraciones por ti. Por ejemplo añadir las variables de entorno en la sección de configuraciones.

Lo siguiente que se tendrá que hacer es añadir las gemas de Redis y Sidekiq en tu Gemfile:
gem 'redis', '~> 4.0'
gem 'sidekiq'
No olvides instalar las gemas:
bundle install
Cada que inicie tu aplicación necesitarás que Heroku genere los workers de tu aplicación para lograrlo necesitaras modificar el Procfile de tu proyecto. Dependiendo de tus configuraciones tu Procfile deberá ser similar a lo siguiente:
web: bundle exec rails server -p $PORT
worker: bundle exec sidekiq -c 2 -q default
Notarás que la configuración de la bandera '-c 2', esto sirve para limitar a 2 el número de conexiones con Redis. En producción deberás ajustar este comando a las necesidades específicas de tu aplicación (conexiones y queues).

Ahora tendremos que modificar nuestras configuraciones de entorno para que Rails sepa que usaremos Sidekiq para el manejo de tareas asíncronas.
# config/environments/production.rb
# config/environments/development.rb

# Use a real queuing backend for Active Job (and separate queues per environment).
config.active_job.queue_adapter     = :sidekiq
config.active_job.queue_name_prefix = "production / development"
Por último deberás configurar tus rutas para acceder al Dashboard de Sidekiq. Ese ejemplo muestra una configuración usando Devise para proteger que solo los Admin puedan acceder a ella.
require 'sidekiq/web'

Rails.application.routes.draw do
  authenticate :admin, lambda { |u| u.super_admin? } do
    mount Sidekiq::Web => '/sidekiq'
  end
end
El modelo Admin cuenta con método super_admin que se encarga de revisar si el usuario tiene los privilegios necesarios para ver el Dashboard de Sidekiq.

Después de tener todo listo lo único que tienes que hacer es revisar la información de los Dynos de Heroku y asegurarte que los comandos de inicialización están encendidos como en la siguiente imagen.

Sidekiq y Heroku