Cómo montar una arquitectura SOA con mensajería y dirigida por eventos con RabbitMQ, y cómo llevar esas notificaciones al navegador con websockets y signalR
2. Índice
Sistemas y aplicaciones distribuidas
Falacias de la computación distribuida
Acoplamiento
Patrones de Integración. Mensajería
AMQP y RabbitMQ
En el navegador: WebSockets/SignalR
3. Sistemas
Aplicación
Único ejecutable en única máquina
Usualmente con una única fuente de información
Conectiviqué?
Sistema
Múltiples ejecutables en múltiples máquinas
Habitualmente con varias fuentes de información
La conectividad es una parte fundamental
Un ejecutable de un sistema != aplicación
4. Servicios
Servicio
Datos + Funcionalidad
Sólo funcionalidad
Es una función, no un servicio
Ej: Una validación
Sólo datos
Es una base de datos
Ej: Operaciones CRUD
5. Falacias computación distribuida
La red es fiable
La latencia es cero
El ancho de banda no es un problema
La red es segura
La topología no va a cambiar
El administrador sabe qué hacer
Los costes de transporte no importan
La red es homogénea
6. Más falacias
El sistema es atómico / monolítico
El sistema está acabado
La lógica de negocio puede y debe estar centralizada
7. El sistema es atómico
Problema
Si consideramos todo el sistema una unidad indivisible, el
mantenimiento es una pesadilla
Si el sistema no fue diseñado para ser escalable a N
máquinas, hacerlo puede en realidad ser
contraproducente
Soluciones
Internamente desacoplado. Modularización
Diseñar para escalar horizontalmente
Diseñar pensando en interacciones con otros
8. El sistema está acabado
Problema
Los costes de mantenimiento son mayores a los de
desarrollo
Cómo actualizaremos el sistema? Y si sólo se ha de
actualizar una parte?
Soluciones
Diseñar para mantenimiento
Diseñar para actualizaciones. Versionado
9. La lógica debe estar centralizada
Problema
“El nombre de usuario tiene menos de 40 caracteres”
Comprobar en UI? Capa de lógica de negocio? BBDD?
Cuando esta regla cambie, dónde hay que tocar?
Soluciones
La lógica estará distribuida. Diseñemos en consecuencia
11. Plataforma
Problemas
Interoperabilidad
Ojo con utilizar protocolos/formatos propietarios
Soluciones
Usar protocolos estándar como http
Serializar a XML, o JSON
12. Temporal (I)
Service A Service B
MakeCustomerPreferred(id)
Customer GetCustomerInfo(id)
Calling thread is
waiting for the
result
Save customer as preferred
13. Temporal (y II)
Service A Service B
Store data Publish updated customer info
MakeCustomerPreferred(id)
Save customer as preferred
14. Espacial
Problema
Código de aplicación ha de saber dónde están los servicios
colaboradores en la red
Solución
Delegar a “alguien” que se encargue de hacer llegar la
petición a quien corresponda
Envío de mensajes?
16. Base de datos compartida
Es EL MAL
Acoplamiento absoluto
Esquema unificado
Aplicaciones externas?
Cuello de botella
Quién toca mis datos?
17. Ficheros
Ventaja
Se explicita un contrato/formato
Problemas
Cuando producir/consumir datos
Staleness/obsolescencia
Si queremos evitarla, es muy costoso de gestionar!
Acoplamiento espacial
18. Invocación remota de métodos
Ventajas
Inmediatez
Encapsulamiento
Problemas
Acoplamiento
de plataforma -> subsanable
Temporal
Espacial
Inmediatez - WTF?
20. Tipos de mensajes
Comando
Enviado por N clientes a un servidor lógico
Servidor puede escalar horizontalmente
Ej: AgregarUsuario
Evento
Enviado por un servidor lógico a N suscriptores
Ej: UsuarioCreado
Tipado de mensajes simplifica enrutado
30. Exchange/Queue
Cada mensaje recibido se envía a todas las colas que
correspondan
Un mensaje enrutado a una cola no se envía más de
una vez, salvo reenvío tras fallo o rechazo
31. Enrutado simple
Direct exchange
Exchange
Unico por sistema
Routing key
Tipo del mensaje
Queue
Nombre del servicio consumidor