Desarrollamos toda la solución utilizando ruby 1.9.3, rails 3.0 y postgresql como la base de datos encargada de preservar la información. Desplegamos en heroku las instancias de desarrollo, prueba y producción. Una instancia mínima de servidor web en la nube soporta una cantidad importante de usuarios concurrentes.
Nuestro bebé está creciendo y quiere caminar...
Pero no todo es color de rosas.
En algún momento de la construcción, alguna tarea supera la barrera de 30 segundos impuesta por el alabado Heroku, apareciendo un mensaje lapidario de 'TimeOut'. Otro inconveniente asociado a estas tareas largas es la sobrecarga de trabajo que le damos al servidor web que hasta acá es nuestro único y fiel trabajador.
Entonces cuando tenemos que hacer estadísticas, reportes mensuales, funciones de chat en vivo, procesar imágenes o enviar mensajes de correo electrónico, el procesamiento asincrónico se vuelve importante para nuestra aplicación.
Que hacer?... una idea es delegar alguno de estos trabajos a otro proceso asincrónico, un 'worker' en la jerga de nuestro server.


Claro que esto no es fácil, tendremos que tener muchas cosas en cuenta... o no.
No tantas como se puede suponer, cuando uno viene de otras tecnologías. Gracias a los chicos de 'Collective Idea' tenemos una gema muy simple de implementar llamada Delayed_job. Existen otras como sidekik, resque u ost (gracias @lguardiola) que llevan a la implementación de una solución similar, cada una con sus ventajas. El premio a la pureza y la simpleza se la doy a ost otra obra de arte minimalista de @soveran Michel Martens creador entre otras cosa del micro framework cuba.
Delayed_job tiene algunas implementaciones particulares como delayed_job_active_record también de la gente de 'Collective Idea' que nos facilitan el modo en que encolamos las instrucciones a procesar. Utilizando la base de datos que tengamos configurada en nuestra aplicación.
El bueno de Ryan Bates nos presenta la gema en este railscast y no se olviden del código fuente del ejemplo.
Para completar el círculo virtuoso y bajar el costo operativo al mínimo. Otra gema espectacular, esta vez recomendación de mi amigo @maxidr, es workless del genial lostboy.
Con workless tenemos que tener un solo cuidado. Si esta usando meta_search de @eniemiller el metodo search en nuestros controller darán error contra el search interno que tiene workless por usar rush. Solución reemplaze .search por .metasearch.
Con workless tenemos que tener un solo cuidado. Si esta usando meta_search de @eniemiller el metodo search en nuestros controller darán error contra el search interno que tiene workless por usar rush. Solución reemplaze .search por .metasearch.
Añadir un comentario