grails, opción real y escalable para sitios web de alta carga
TRANSCRIPT
![Page 1: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/1.jpg)
De cero a 1.7 M de usuarios
Grails, opción real para sitios web de alta carga y escalabilidad.Una experiencia al crear la más grande
plataforma de eCommerce con Grails en Latinoamérica.
![Page 2: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/2.jpg)
Agenda
• Negocio
• Diseño inicial
• Infraestructura
• Problemas
• El futuro
![Page 3: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/3.jpg)
NegocioUna tienda en linea, con una amplia
y creciente gama de servicios y productos
![Page 4: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/4.jpg)
Negocio
• Ventas en grupo
• Cupones.
• Pero no solo cupones...
• Campañas de email masivas.
• Campañas de publicidad masivas.
![Page 5: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/5.jpg)
Diseño inicialGrails, Terracotta, RabbitMQ & mySQL
![Page 6: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/6.jpg)
Grails
• Grails 1.3.4
• GORM
• Servicios
• Controllers y TagLibs
• Jobs
![Page 7: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/7.jpg)
GORM, lo bueno• Facilidad de crear modelos
• Modelos ricos
• Consultas
• Criteria
• DynamicFinders
• Actualización del esquema de base de datos
![Page 8: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/8.jpg)
GORM, lo malo• No es posible probar DynamicFinder y Criteria de forma
unitaria
• Pruebas integrales, a veces toma mucho tiempo
• Es sencillo cometer errores debido a la facilidad
• Olvidar crear indices
• Iterar grandes colecciones
• Dejar que Grails nombre relaciones (tablas o campos)
![Page 9: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/9.jpg)
Servicios, lo bueno
• Lógica de negocio
• Servicios que “escuchan” eventos
• Extensivo uso de Dependency Inyection
• Composición, agregación
• Reglas de negocio flexibles
![Page 10: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/10.jpg)
Servicios, lo malo• Abusar de Dependency Inyection
• Referencias circulares
• No es tema de Grails exclusivamente, con Spring se presenta también.
• Duplicar nombres de Servicios, en diferentes paquetes
• Olvidar quitar la administración transaccional cuando no es necesaria.
![Page 11: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/11.jpg)
Controllers, lo bueno
• Ridículamente simple
• Generar JSON/XML es trivial
• Reglas de mapeo, muy sencillo y flexible (URLMappings)
• Totalmente desacoplado de la vista
![Page 12: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/12.jpg)
Controllers, lo malo
• Nada
![Page 13: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/13.jpg)
TagLibs, lo bueno
• Estúpidamente simple crearlas :)
• Apoyo de Dependency Inyection para acceder a servicios, o a cualquier componente.
• Condicionar la generación de contenido
• Llenar plantillas (fragmentos de una página)
![Page 14: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/14.jpg)
TagLibs, lo malo
• Usarlas como scriptlets
![Page 15: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/15.jpg)
Grails, en general
• Permite que un desarrollador Java, explote su conocimiento.
• Aumenta la productividad debido a el uso de “Convención sobre Configuración”
• Incrementa brutalmente la facilidad de convertir requerimientos de negocio en código ejecutable
![Page 16: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/16.jpg)
Grails
• En mi humilde opinión, la mejor opción para desarrollo web en Java, de cualquier tamaño o requerimiento
• Disclaimer: Es solo mi experiencia personal, no puedo garantizar el mal uso de Grails. También puedo equivocarme. Es mi punto de vista como desarrollador.
![Page 17: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/17.jpg)
Negocio
• En Agosto de 2010 @dvd2k5 me dijo:
• Hey domix; en un año tendremos un millón de usuarios
• @domix
• :O
![Page 18: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/18.jpg)
Escalabilidad y Disponibilidad
Vitales para estar en un negocio muy competitivo
![Page 19: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/19.jpg)
Terracotta• Cache distribuido
• Evitamos accesos a la BD
• Guardamos Objetos Java y HTML
• Entidades de Hibernate
• Páginas completas
• Fragmentos de páginas
![Page 20: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/20.jpg)
Terracotta
• Usamos EhCache como “fachada”
• En desarrollo no usamos Terracotta
• En producción y QA configurado
• El código aplicativo no se ve modificado
![Page 21: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/21.jpg)
Terracotta• IMHO, es una de las mejores piezas de software
jamas escritas en Java
• Robusto, Estable
• Confiable, Ligero
• Casi cero administración
• Configuración muy sencilla
• Uptime de meses en producción
![Page 22: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/22.jpg)
Terracotta
• Lo usamos para clusterizar sesiones HTTP, pero no quedo productivo
• No quería cargar con mas trabajo a Terracotta
• Evitar tener un solo punto de falla
• También lo usamos muy poco tiempo para clusterizar Jobs con Quartz
![Page 23: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/23.jpg)
RabbitMQ• Servicio de mensajería
• Diferente a JMS
• Escrito en Erlang
• Muy robusto, estable
• Casi cero administración
• Desarrollado por vmWare
![Page 24: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/24.jpg)
RabbitMQ
• Procesamiento asíncrono
• Procesos muy tardados
• Envío de email
• Consultas pesadas (reportes financieros)
• Integración con otras aplicaciones
![Page 25: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/25.jpg)
RabbitMQ, lo malo
• No hay muchas herramientas de administración/monitoreo
• Las que hay son poco “amistosas”
• Cuando falla, falla muy duro
• Los logs de error son como Hebreo antiguo o mas bien como lenguaje Orco.
![Page 26: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/26.jpg)
RabbitMQ, lo malo
• No hay muchas herramientas de administración/monitoreo
• Las que hay son poco “amistosas”
• Cuando falla, falla muy duro
• Los logs de error son como Hebreo antiguo o mas bien como lenguaje Orco.
![Page 27: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/27.jpg)
RabbitMQ, nada malo• Antes he usado varios servicios de
mensajería
• Todos ellos basados en Java
• RabbitMQ ha sido al que he visto que se le ha puesto una carga muy grande, sin necesidad de afinar la configuración.
• IMHO. La mejor opción.
![Page 28: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/28.jpg)
RabbitMQ, nada malo• Antes he usado varios servicios de
mensajería
• Todos ellos basados en Java
• RabbitMQ ha sido al que he visto que se le ha puesto una carga muy grande, sin necesidad de afinar la configuración.
• IMHO. La mejor opción.
![Page 29: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/29.jpg)
mySQL
• ¿que puedo decir?
![Page 30: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/30.jpg)
mySQL• Tenemos instalada una versión “tuneada” por
RackSpace
• Una palabra para describirla: Impresionante
• He vivido engañado por muchos años.
• Un pequeño comportandose como nunca he visto un grande.
• Nuestro mySQL ha soportado +15 millones de queries en un día
![Page 31: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/31.jpg)
Infraestructura2 versiones
![Page 32: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/32.jpg)
Cajas Versión 1• 2 WebServers
• 1 Tomcat 6 con AJP = cluster de 2 Tomcats
• Apache HTTPD con mod_proxy
• 1 DBServer
• 1 Firewall físico
• 1 LoadBalancer físico
• Rackspace Londres
![Page 33: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/33.jpg)
Cajas Versión 2• 4 WebServers
• 2 Tomcat 6 con AJP = cluster de 8 Tomcats
• Apache HTTPD con mod_proxy
• 1 DBServer
• 1 Firewall físico
• 1 LoadBalancer físico
![Page 34: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/34.jpg)
Fierros Versión 2• Dual Quad Core Xeon 2.26 HGZ
• 24 GB de RAM
• 300 GB SAS X 3
• RedHat Enterprise Linux 5.6
• En Hospedaje dedicado en Rackspace Chicago
![Page 35: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/35.jpg)
Problemas
• Quartz Jobs clusterizados
• Ahora corren en una instancia propia
• Indices faltantes en la base de datos
• Consultas muy mal escritas
• Mala configuración del log
![Page 36: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/36.jpg)
![Page 37: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/37.jpg)
Solucionar problemas
• Necesitas métricas, indicadores
• Medición
• ¿Profiler?
• ¿JMX?
![Page 38: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/38.jpg)
![Page 39: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/39.jpg)
Competitividad
Datos de Alexa.com del día 21 de Octubre de 2011
![Page 40: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/40.jpg)
¿Como lo logramos?
![Page 41: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/41.jpg)
![Page 42: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/42.jpg)
Negocio
• En Septiembre de 2011 @dvd2k5 me dijo:
• Hey domix; en un año tendremos 5 millones de usuarios
• @domix
• :O
![Page 43: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/43.jpg)
Estrategia actual y futura
• Hacer la webapp actual lo mas estática posible
• Modularizar la aplicación en un conjunto de servicios
• Usar mensajería para comunicarlos
• Usar Scala como lenguaje complementario a Groovy
• Akka para procesamiento asíncrono
• MongoDB como almacén secundario
• Redis como cache recundario
![Page 44: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/44.jpg)
Estrategia actual y futura
• Convirtiendo los servicios en un API Rest
• clickOnero móvil iOS este año
• clickOnero móvil Android próximo año
• Facebook App próximo año
• Apertura del API próximo año
![Page 45: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/45.jpg)
El equipo
![Page 46: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/46.jpg)
¿Preguntas?
![Page 47: Grails, opción real y escalable para sitios web de alta carga](https://reader035.vdocuments.net/reader035/viewer/2022081414/5484f081b4af9fde0c8b4598/html5/thumbnails/47.jpg)
Créditos fotos• http://flic.kr/p/e61Pt
• http://flic.kr/p/7cxoek
• http://flic.kr/p/5vSqgq
• http://flic.kr/p/6K9jb8
• http://flic.kr/p/6h8UoU
• http://flic.kr/p/24GsCj
• http://flic.kr/p/2wGvZi
• http://flic.kr/p/7jLN6x
• http://flic.kr/p/2VvzMw
• http://flic.kr/p/9c7z9T
• http://flic.kr/p/J1NKm