SOA multiplataforma con rabbitmq y websockets

Post on 02-Jul-2015

1.668 views 0 download

description

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

Transcript of SOA multiplataforma con rabbitmq y websockets

SOA multiplataformaAplicaciones distribuidas con RabbitMQ y WebSockets

Braulio Megias

@bmegias

http://bmegias.wordpress.com

Í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

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

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

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

Más falacias

El sistema es atómico / monolítico

El sistema está acabado

La lógica de negocio puede y debe estar centralizada

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 sercontraproducente

Soluciones

Internamente desacoplado. Modularización

Diseñar para escalar horizontalmente

Diseñar pensando en interacciones con otros

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

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

Acoplamiento

Plataforma

Temporal

Espacial

Plataforma

Problemas

Interoperabilidad

Ojo con utilizar protocolos/formatos propietarios

Soluciones

Usar protocolos estándar como http

Serializar a XML, o JSON

Temporal (I)

Service A Service B

Customer GetCustomerInfo(id)

Calling thread is

waiting for the

result

MakeCustomerPreferred(id)

Save customer as preferred

Temporal (y II)

Service A Service B

Publish updated customer infoStore data

MakeCustomerPreferred(id)

Save customer as preferred

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?

Patrones de integración

Base de datos compartida

Ficheros

RPC

Mensajería

Base de datos compartida

Es EL MAL

Acoplamiento absoluto

Esquema unificado

Aplicaciones externas?

Cuello de botella

Quién toca mis datos?

Ficheros

Ventaja

Se explicita un contrato/formato

Problemas

Cuando producir/consumir datos

Staleness/obsolescencia

Si queremos evitarla, es muy costoso de gestionar!

Acoplamiento espacial

Invocación remota de métodos

Ventajas

Inmediatez

Encapsulamiento

Problemas

Acoplamiento

de plataforma -> subsanable

Temporal

Espacial

Inmediatez - WTF?

Mensajería

Completamente desacoplado: espacial, temporal, plataforma

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

Ejemplo (I)

Shop Order Billing Shipping

PlaceOrder

OrderBilled

OrderShipped

ShipOrder

BillOrder

Ejemplo (y II)

Shop Order Billing Shipping

PlaceOrder

OrderPlaced

OrderBilled

OrderShipped

A considerar

Duplicar información

Orden de los mensajes

Mensajes repetidos

RabbitMQ

http://www.rabbitmq.com/

AMQP

Mensajes Cuerpo + Routing Key

Exchanges / Queues / Bindings Direct Fanout Topic

AMQP (I)

Advanced Message Queueing Protocol

http://www.amqp.org

Abierto, platform-agnostic, interoperable

Define cómo clientes y brokers interactúan

Los detalles quedan ocultos en las librerías cliente

AMQP Model

Define enrutado y almacenamiento de mensajes

Exchange/Queue

Cada mensaje recibido se envía a todas las colas quecorrespondan

Un mensaje enrutado a una cola no se envía más de

una vez, salvo reenvío tras fallo o rechazo

Enrutado simple

Direct exchange

Exchange

Unico por sistema

Routing key

Tipo del mensaje

Queue

Nombre del servicio consumidor

Cliente

Comandos

Llamadas AJAX

Eventos

Polling

Long-Polling / COMET

WebSockets

WebSockets (I) Full-duplex

Comunicación full-duplex utilizando un socket TCP

Inicio: GET

GET /chat HTTP/1.1

Connection: Upgrade

Host: example.com

Origin: http://example.com

Sec-WebSocket-Key1: 284 ^rI 2 447 8 Me1*V 8

Sec-WebSocket-Key2: 30]8N763$84 12>

Upgrade: WebSocket

64:6E:AC:0C:FD:90:8A:51

WebSockets (II)

Respuesta

HTTP/1.1 101 WebSocket Protocol Handshake

Upgrade: WebSocket

Connection: Upgrade

Sec-WebSocket-Origin: http://example.com

Sec-WebSocket-Location: ws://example.com/chat

79:C5:C1:29:4A:60:8B:34:66:D5:61:10:C2:0C:4F:AA

Implementaciones

Emulación con Flash para navegadores antiguos

Servidor

Superwebsocket

También cliente .net

http://superwebsocket.codeplex.com/

ASP.NET 4.5 + IIS 8

Requiere Windows 8 + VS11

Nuget Microsoft.websockets

SignalR

https://github.com/SignalR/SignalR

http://jabbr.net/

Notificaciones para aplicaciones web

Selección automática del método de conexión

Super-simple

Gracias por vuestra atención

Braulio Megías

@bmegias

http://bmegias.wordpress.com