Concurrencia en Heroku

Hace unas semanas comenzaron a aparecer ciertas críticas hacia Heroku debido a cambios en la política del enrutado de las peticiones a los dynos.

Antes de este cambio en la política, cuando una petición llegaba a una aplicación, esta se dirigía en primer lugar a alguno de los dynos que estuvieran libres. A partir del este cambio en la política de enrutado, el dyno al que se dirije la petición se selecciona de manera aleatoria, por lo que hay una bajada de rendimiento importante, sobretodo en aplicaciones que usen muchos dynos.

Si por ejemplo, tenemos una aplicación que tiene 100 dynos, de los cuales 99 están ocupados, y llega una petición el funcionamiento es el que sigue.

  • Con el enrutado antiguo, la petición se dirige al dyno libre y se atiende instantáneamente.
  • Con el enrutado nuevo el dyno al que se dirige la petición se selecciona de manera aleatoria, con lo que tenemos un 99% de posibilidades de que la petición se dirija a un dyno ocupado y ésta sea encolada.

Esto es un ejemplo muy básico pero puede servir para hacernos a la idea.

Una de las razones que esgrimía Heroku para este cambio en la política, es que ahora se aceptaban muchos más frameworks en la plataforma, y que con este cambio era más sencillo gestionar las colas de peticiones. El problema es que las aplicaciones Rails sólo aceptaban una petición, con lo que quien más salía perdiendo con este cambio era el framework que fue el principal y único de Heroku durante mucho tiempo.

Parece ser que la política de enrutado no va a volver a ser la que era, pero como compensación, Heroku ha comunicado que a partir de ahora habilitará la posibilidad de utilizar Unicorn para servir las aplicaciones Rails. Unicorn es un servidor de aplicaciones que si admite peticiones concurrentes, con lo que se mitiga en cierto modo el problema de la política de enrutado.

En el blog de Heroku han escrito un post sobre cómo configurar nuestra aplicación para que utilice Unicorn.

Referencias:

Heroku

Unicorn

Heroku Blog – Adding Concurrency to Rails Apps with Unicorn

Heroku

Heroku es un servicio en la nube para el alojamiento de aplicaciones web. Dentro de los diversos tipos de servicios que nos ofrece la nube, Heroku se encuentra en el grupo de PaaS, Platform as a Service o Plataforma como servicio. Nos permite habilitar nuevas funcionalidades para nuestras aplicaciones en forma de addons así como escalar nuestra aplicación de una forma bastante sencilla. Por último, nos permite desplegar cualquier aplicación Ruby que utilice el interfaz Rack, como son por ejemplo Rails o Sinatra. Además también nos permite desplegar aplicaciones Node.js y desde hace poco aplicaciones Java.

Crear una aplicación en Heroku es bastante simple, al menos para aplicaciones Rails que es con lo que he probado.

Lo primero que hay que hacer es descargar la gem de Heroku, lo que se hace con un único comando:

gem install heroku

Una vez hecho esto, ya podemos utilizar los comandos de Heroku para desplegar nuestra aplicación en la nube. Hay que tener en cuenta que Heroku nos ofrece como base de datos PostgreSQL, por lo que deberíamos cambiar la gem correspondiente a la base de datos que usemos por la gem pg. Lo siguiente que tenemos que hacer es tener nuestra aplicación en un repositorio Git, ya que lo que haremos cada vez que queramos desplegar nuestra aplicación es hacer un push de nuestra aplicación al repositorio que hay en Heroku.

git init
git add .
git commit -m "Primer commit"

Una vez hecho esto ya podemos crear la aplicación en Heroku.

heroku create [--stack cedar]

La parte de “–stack cedar” es opcionar. El stack cedar el la última versión de la plataforma, por así decirlo, y todavía está en fase beta, pero parece ser que es necesario para las aplicaciones Rails 3.x.

Por último desplegamos la aplicación.

git push heroku master

Con esto ya tenemos el código en el servidor de aplicaciones, y tan sólo nos faltaría crear la base de datos en caso de que fuera necesario.

heroku rake db:migrate

En la web de heroku podemos ver la url de nuestra aplicación, cambiar la url y alguna cosa más. También podéis abrir la aplicación ejecutando:

heroku open

Y eso es todo, con esto ya tenéis una aplicación Rails en Heroku!