Ejemplo de módulo de apoyo para servir Json usando Merb + Datamapper
En placechannel.com, el 90% de las las peticiones estan basadas en la obtención de los videos en una zona determinada del mapa, y para ello se hace una petición ajax solicitando dichos videos, y obteniendo éstos en formato Json.
Como comprobareis por mis entradas anteriores, he estado obsesionado con el rendimiento del parseo AR => JSON pues como he comentado, gran parte del peso de la aplicación cae sobre éste.
Entonces decidí probar suerte con Merb, pero siempre con la idea de crear un módulo de apoyo nunca sustituir ROR.
¿Por qué merb?
- Los ciclos de bloqueo del dispatch son mas cortos, por tanto puedo servir mayor número de peticiones teniendo bloqueados los servidores de aplicaciones(mongrel, thin, ..) el menor tiempo posible y permitiendo mayor concurrencia de peticiones.
- Usa poco código(No code is faster than no code), y para este modulo tan simple parece una buena opción.
¿Por qué Datamapper?
- Es thread-safe, ActiveRecord no.
- Tiene como prioridad la eficiencia.
- Se parece a ActiveRecord ;-)
Desde la versión 0.9.0 de Merb existen tres generadores a la hora de crear aplicaciones:
- merb-gen app foo_app
- merb-gen app foo_app –flat
- merb-gen app foo –very-flat
Cada una de las opciones nos va dando un esqueleto de aplicación cada vez con menos ficheros, en nuestro caso usé la tercera opción, obteniendo ¡una aplicación en un solo fichero!.
Nuestra aplicación no tendrá mas que lo siguiente:
- Un modelo Video con titulo, código, lat y lng como atributos.
- Un controlador llamado Main con una única accion y que sirva json.
Quedando de la forma ...
Ya tenemos el modulo listo y solo nos queda arrancarlo:
Ejemplos:
- Un solo mongrel en el puerto 4000
merb -I foo.rb -p 4000 -d - Cluster de dos servidores thin:
merb -I foo.rb -p 4000 -c 2 -a thin -d - ...
Simple ¿no?, nada de plugins externos(mongrel_rails) para balancear en clusters
Resultados.
Mis pruebas hechas con ApacheBench y Httperf devuelven que el nuevo módulo basado en merb + datamapper es aproximadamente el doble de rápido,en comparación con mi antigua acción en rails que usaba to_json.
Lo cierto es que los resultados me han dejado satisfecho y mas teniendo en cuenta que éstos son mejores a favor de merb cuanto mas crece la concurrencia.
Como veréis no he explicado como instalar merb como configurar Datamapper, ..., no era mi intención, simplemente quería mostrar mi primera experiencia con merb y quién sabe si a alguien le sirve de ejemplo.
Tip: Instala la gema json(gem install json) basada en C, para mejorar el rendimiento del parseo.
