Rails + Heroku + Sidekiq

Rails + Heroku + Sidekiq

enmanuelm19@gmail.com2018-06-18 12:41:05 UTC

Despligue con Rails y sidekiq en Heroku

En este post se mostrara como desplegar una aplicación hecha en Rails, con el procesador de tareas en segundo plano Sidekiq en Heroku, hay dos maneras de desplegar un aplicativo de estas características:

  1. En el mismo dyno:

    La plataforma Heroku trabaja con dynos para manejar sus recursos, por esto de manera gratuita te dan el dyno web donde corre el servidor que tiene configurado tu aplicación, si añades mas dynos dentro de la plataforma empieza a ser pago. Lo que haremos es configurar sidekiq para que corra dentro de este dyno. Cabe acotar que no es recomendable hacerlo de esta manera para aplicaciones en producción, Sidekiq es un procesador de tareas en segundo plano que trabaja con Redis para manejar la configuración de sus procesos. Existen varios add-ons para trabajar con redis como Heroku Redis o Redis Cloud.

    Para configurar Puma y trabajar con sidekiq creamos el archivo config/puma.rb e ingresamos lo siguiente:

        threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
        threads threads_count, threads_count
        port        ENV.fetch("PORT") { 3000 }
        environment ENV.fetch("RAILS_ENV") { "development" }
        workers ENV.fetch("WEB_CONCURRENCY") { 2 }
        preload_app!
    
        before_fork do 
            @sidekiq_pid ||= spawn('bundle exec sidekiq -t 25')
        end
    
        on_worker_boot do
            ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
        end
    
        on_restart do
            Sidekiq.redis.shutdown { |conn| conn.close }
        end
    

    Crear archivo Procfile en la raíz del proyecto y colocar lo siguiente:

    web: bundle exec puma -C config/puma.rb
    

    Guardar y desplegar en Heroku..

  2. Worker dyno:

    Esta es la forma recomendada para configurar debido a que trabaja en un proceso distinto al servidor, si por alguna razón alguno se cae no afecta al otro. Necesitas instalar algún add-on para correr Redis dentro de Heroku, sigue las instrucciones de los enlaces en el primer paso de este post. Luego de configurado Redis creamos el archivo config/sidekiq.yml y colocamos lo siguiente:

    development:
      :concurrency: 5
    production:
      :concurrency: 3
    :queues:
      - default
    

    En la sección de :queues: colocar los que haz declarado en tu aplicación

    Configurar la conexión entre Redis y Sidekiq, dentro del archivo config/initializers/sidekiq.rb colocar lo siguiente:

    if Rails.env.development?
      Sidekiq.configure_server do |config|
        config.redis = { url: 'redis://localhost:6379' }
      end
    end
    
    if Rails.env.production?
      Sidekiq.configure_client do |config|
        config.redis = { url: ENV['REDIS_URL'], size: 2 }
      end
    
      Sidekiq.configure_server do |config|
        config.redis = { url: ENV['REDIS_URL'], size: 20 }
      end
    end
    

    Recordar colocar en las variables de entorno en Heroku la dirección de Redis que haz instalado bajo el nombre REDIS_URL

    Para que Heroku tome en cuenta esta configuración y lo monte dentro de un worker dyno colocamos lo siguiente en el Procfile:

    web: bundle exec puma -C config/puma.rb
    worker: bundle exec sidekiq -e production -t 25 -C config/sidekiq.yml
    

Con esto hemos configurado exitosamente una aplicación de Rails con Sidekiq como manejador de procesos en segundo plano.


Cualquier duda o consejo es bien recibido en los comentarios.


Compartir