Aumentar velocidad de aplicación Rails en Heroku con Unicorn

El creado de Ruby ahora trabaja en Heroku.

¿Qué es Heroku?

Heroku es una plataforma como servicio (SaaS), que nos permite alojar aplicaciones desarrolladas en distintos lenguajes como: Python, Ruby, Scala y Java sin preocuparnos demasiado por la infraestructura gracias a su sencillo gestor de Add-ons a demás de soportar MongoDB y PostreSQL para bases de datos. Su sistema esta basado en Debian sobre Amazon Web Services y lo mejor de todo es que es gratuito para aplicaciones pequeñas, si requieres mayor poder puedes comprar dynos (es el contenedor encargado de ejecutar un comando especifico, es como un proceso)según tus necesidades.

¿Qué es Rack?

Es una interfaz modular y adaptable para el desarrollo de aplicaciones web en Ruby. Permite manejar peticiones y respuestas HTTP de la forma más simple posible. Es utilizado por frameworks como Ruby on Rails y Sinatra

¿Que es Uicorn?

Rails fue diseñado para responder una petición a la vez, aunque con el tiempo se ha ido modificando para soportar concurrencia. Sin embargo aun no se ha implementado por completo y muchas aplicaciones no lo soportan. Ruby incluye WEBrick como servidor y es el que tu aplicación utiliza en este momento, lo cual esta bien para desarrollo pero en el entrono de producción las cosas cambian y es necesario exprimir al máximo de Heroku, para eso tenemos a unicorn.

Unicorn es un servidor HTTP para aplicaciones basadas en Rack y por lo tanto Ruby. Se aprovecha de las ventajas que ofrecen los sistemas tipo Unix y a demás nos permite ejecutar procesos Ruby de forma concurrente en cada dyno de Heroku. Es por eso que se recomienda usar unicorn si tu aplicación se encuentra en Heroku.

Instalación

Añadimos unicorn a nuestro Gemfile.

gem 'unicorn'

Procfile es un archivo dónde especificamos que comandos se ejecutaran en nuestros dynos

Creamos un archivo Procfile (si es que aun no lo tenemos), en la raíz de nuestra aplicación. Y añadimos lo siguiente para que Heroku ejecute nuestra aplicación con unicorn:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

Creamos nuestro archivo en config/unicron.rb y agregamos.

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

De forma general; es estamos indicando que ejecute 3 procesos por dyno de un máximo de 4, que pre-cargue la aplicación para reducir los tiempos de inicio de cada proceso y  como iniciar o terminarlos. Para más información clic aquí.

¡Listo! realizamos el deploy con git. En mi caso la velocidad aumento considerablemente al cargar el sitio desde un dispositivo móvil Android y un poco menos en escritorio.

 

Referencias:

Process Types and the Procfile | Heroku Dev Center

Deploying Rails Applications With Unicorn | Heroku Dev Center

Unicorn en Heroku | Blog botti.co

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s