![Page 1: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/1.jpg)
¡Quiero Tiempo Real y lo quiero para ayer!
Iván López Martín @ilopmar
![Page 2: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/2.jpg)
¿Quién soy?
Iván Lopez Martín @ilopmar
Trabajo en Kaleidos
Uso Groovy/Grails desde hace casi 4 años
Creador de www.bokzuy.com
Creador de varios plugins de Grails
Sospechoso habitual de Madrid-GUG (Groovy User Group)
Geek, padre, desarrollador, sysadmin, linuxero y pro-software libre
![Page 3: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/3.jpg)
Arquitecturas tradicionales
Request-response
POST /register-user
POST /register-user
POST /register-user
![Page 4: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/4.jpg)
Arquitecturas tradicionales
![Page 5: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/5.jpg)
Arquitecturas tradicionales
![Page 6: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/6.jpg)
A problem postponed is a problem solved
really?
![Page 7: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/7.jpg)
Arquitecturas orientadas a eventos
- Event Driven Architecture (EAD)
- Fire & Forget
- Desacoplan al productor del consumidor
- Acción inmediata en los consumidores
- Tiempo real / Notificaciones push
![Page 8: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/8.jpg)
Arquitectura tradicional
Ejemplo arquitectura tradicional (request-response)
Total 395 ms
POST /purchase
POST /purchase - Recibir petición 5 ms - Validación de datos 20 ms - Guardar 40 ms - Generar PDF 200 ms - Enviar email 80 ms - Renderizar respuesta 50 ms
![Page 9: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/9.jpg)
Can we do it better?
![Page 10: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/10.jpg)
POST /purchase - Recibir petición 5 ms No - Validación de datos 20 ms No - Guardar 40 ms No - Generar PDF 200 ms Sí - Enviar email 80 ms Sí - Renderizar respuesta 50 ms No
Arquitecturas orientadas a eventos
Ejemplo EDA
Total 115 ms ~ 70% mejora
POST /purchase
¿Puede hacerlo alguien más?
![Page 11: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/11.jpg)
Arquitecturas orientadas a eventos
POST /purchase
POST /purchase - Recibir petición 5 ms - Validación de datos 20 ms - Guardar 40 ms - Renderizar respuesta 50 ms
Total: 115 ms Generar PDF
POST /purchase - Recibir petición 5 ms - Validación de datos 20 ms - Guardar 40 ms - Renderizar respuesta 50 ms
Total: 115 ms Enviar email
![Page 12: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/12.jpg)
Don't keep your clients waiting!
Can I defer it?
![Page 13: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/13.jpg)
Objetivos
- Arquitectura menos acoplada, más fácil de extender, evolucionar y mantener
- Construir sistemas de alto rendimiento y altamente escalables
- Mantener la lógica dónde debe estar y no repartida por toda la aplicación
- Idealmente los cambios los pueden realizar equipos distintos
![Page 14: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/14.jpg)
¿Y en Grails?
Todo esto está muy bien pero yohe venido a hablar de “mi libro”: Grails
- Platform Core- Events push- Plugin Executor- Grails 2.3 Async
![Page 15: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/15.jpg)
Ejemplo síncrono
// Envío de email de confirmación al registrar un usuariodef user = new User(params).save()emailService.sendRegistationMail(user)render view:'registerOk'
class EmailService { public void sendRegistrationMail(User user) { sendMail { to user.email subject “Confirm your account” html g.render(template: “userEmailConfirmation”) } }}
![Page 16: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/16.jpg)
Ejemplo asíncrono
// Platform coredef user = new User(params).save()event('sendRegistrationMail', user)render view:'registerOk'
class EmailService { @grails.events.Listener public void sendRegistrationMail(User user) { sendMail { to user.email subject “Confirm your account” html g.render(template: “userEmailConfirmation”) } }}
![Page 17: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/17.jpg)
Ejemplo asíncrono
// Executordef user = new User(params).save()runAsync { emailService.sendRegistationMail(user)}render view:'registerOk'
![Page 18: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/18.jpg)
I love the smell of code in the morning
![Page 19: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/19.jpg)
Problemas
- Código muy acoplado a la solución utilizada
- Difícil de testear
![Page 20: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/20.jpg)
¿Y si no queremos que sea así?
- Podemos extraer esas dependencias a “configuración”
- Es posible cambiar el comportamiento de la aplicación cambiando sólo la configuración
![Page 21: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/21.jpg)
Spring Integration
Permite utilizar dentro deSpring los conocidos Enterprise Integration Patterns
http://www.enterpriseintegrationpatterns.com/
![Page 22: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/22.jpg)
Spring Integration
- Mecanisnos ligeros de mensajería en aplicaciones Spring
- Integración de sistemas externos declarando adaptadores.
- Abstracción de alto nivel de aplicaciones de mensajería.
- El código de la aplicación no es consciente del API de la mensajería.
- Proporciona un modelo simple para construir aplicaciones EIP manteniendo separación conceptos y permitiendo crear código mantenible y fácilmente testeable.
![Page 23: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/23.jpg)
Principales Características
“Pipe and filters”
![Page 24: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/24.jpg)
Message
- Datos (payload) pueden ser cualquier objeto
- Cabecera (header) información adicional almacenada en un Map
- Son inmutables
![Page 25: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/25.jpg)
Channel
- Point-to-Point
- Publish-Subscribe
![Page 26: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/26.jpg)
Endpoints
- Transformer
- Filter
- Router
- Splitter
- Aggregator
- Service activator
- Channel adapter
- Enricher
- Bridge
...
![Page 27: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/27.jpg)
Adapters
- JMS
- AMQP
- TCP
- UDP
- File
- FTP
- SFTP
- RMI
- HTTP (REST)
- WS
- Mail (POP3/IMAP/SMTP)
- JDBC
- XMPP
- RSS
- MongoDB
- Redis
- GemFire
- Stream
![Page 28: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/28.jpg)
Talk is cheap. Show me the code.
![Page 29: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/29.jpg)
DEMO
Por favor sacrificad una virgen cabra para que los dioses de las demos repartan suerte
![Page 30: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/30.jpg)
FUTURO/ALTERNATIVAS
- Reactor Framework: Proporciona abstracciones para Java, Groovy y el resto de lenguajes de la JVM para construir aplicaciones event-driven. En hardware normal consiguen 15.000.000 de eventos por segundo. Soporte de Java 8.
- Spring 4: Soporte de Groovy como “first class citizen”, Reactor Framework, no más XMLs, Websockets nativos, SockJS,...
- Grails 2.4: Release previa a la 3.0 con soporte de Spring 4.
![Page 31: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/31.jpg)
CONCLUSIONES
- La arquitectura estandar de Grails sirve para muchos casos
- No escala infinito
- Hay que plantearse desde el principio qué tipo de aplicación estamos construyendo
- Puede que no estemos construyendo el próximo Instagram ¿o tal vez sí?
- Es necesario pensar en flujos de la información
- Costes de infraestructura vs Costes de código (más hierro vs deuda técnica)
![Page 32: Codemotion 2013 - Quiero tiempo real y lo quiero para ayer](https://reader034.vdocuments.co/reader034/viewer/2022042816/559457381a28ab642f8b4662/html5/thumbnails/32.jpg)
http://lopezivan.blogspot.comhttp://lopezivan.blogspot.com
@ilopmar@ilopmar
https://github.com/lmivanhttps://github.com/lmivan
Iván López MartínIván López Martín
[email protected]@gmail.com
Feedback de la charla:Feedback de la charla:http://goo.gl/e4AjKYhttp://goo.gl/e4AjKY
¡ GRACIAS !