Middleware de Mensajería (MOM)
Definición
El Message Oriented Middleware (MOM) es uno de los sistemas más utilizados en la integración de aplicaciones.
- Provee un mecanismo de comunicación asíncrona basado en el encolamiento de mensajes (Message Queuing).
- Administra el envío y entrega de mensajes. Su tarea principal es asegurar que este proceso sea realizado de una manera confiable.
Características
El objetivo principal de un middleware de mensajería es transmitir mensajes desde un computador a otro.
- Cuando una aplicación envía un mensaje, la aplicación receptora no necesariamente debe estar disponible.
- Aun cuando ambas aplicaciones se encuentren disponibles, pueden existir problemas de red que impidan la transmisión de un mensaje.
- Un sistema de mensajería debe superar estas limitaciones intentando reenviar el mensaje hasta que sea logrado.
Transmisión de Mensajes
En esencia, un mensaje es enviado en cinco pasos:
- Creación: El emisor crea el mensaje adjuntando datos.
- Envío: El emisor coloca el mensaje en una cola.
- Entrega: El sistema de mensajería mueve el mensaje desde el computador del emisor al computador del receptor, dejándolo disponible para su recepción.
- Recepción: El receptor lee el mensaje desde una cola.
- Procesamiento: El receptor procesa la data del mensaje.
Conceptos Básicos del MOM
Colas
Una vez que un sistema de mensajería está disponible, se requiere un medio físico para la transmisión de mensajes entre dos aplicaciones.
- Para que dos aplicaciones se puedan comunicar, ambas deben utilizar la misma cola.
- La aplicación emisora no sabe necesariamente cuál es la aplicación receptora. Lo mismo aplica en sentido inverso.
Mensaje
Las aplicaciones empaquetan información dentro de un mensaje, que corresponde a datos que un sistema de mensajería puede transmitir desde un emisor a un receptor a través de un canal.
Un mensaje consiste de dos partes:
- Header: Información usada por el sistema de mensajería que describe la data transmitida, su origen, destinos, etc.
- Body: Contiene la data a ser transmitida entre dos aplicaciones. El sistema de mensajería conserva su integridad y formato durante la transmisión.
Filtro
Los filtros son utilizados para dividir el procesamiento de un mensaje en tareas más pequeñas, independientes, que son conectadas a través de una cola.
- Un filtro recibe un mensaje desde una cola, procesa el mensaje y lo coloca en una cola de entrada a otro filtro.
Enrutadores (Routers)
Un enrutador (Router) es un filtro especial, el cual consume un mensaje desde una cola y lo republica en otra, dependiendo de ciertas reglas.
- Se diferencia de un Filtro dado que conecta múltiples colas de salida.
- El beneficio principal de usar un enrutador es que las reglas para decidir el destino de un mensaje residen en un solo lugar.
Transformador
Un transformador es un filtro especial que traduce un tipo de formato en otro.
- Permite que aplicaciones con modelos de datos diferentes puedan ser integradas.
- Permite que aplicaciones con interfaces propietarias puedan ser accedidas por otras aplicaciones.
Niveles de Transformación
Estructuras de datos
- Entidades, relaciones, cardinalidad.
Tipos de datos
- Nombres, tipos y dominios de datos, códigos.
Representación de datos
- XML, largo posición, uso de separadores, propietario.
Transporte
- Protocolos de comunicación: TCP/IP, HTTP, SOAP.
Endpoints
Los Endpoints permiten a las aplicaciones conectarse a un sistema de mensajería para enviar o recibir mensajes.
- Una aplicación no necesita conocer el formato, la cola utilizada, ni otros detalles de comunicación con otras aplicaciones a través del sistema de mensajería.
- Un endpoint utiliza la API del sistema de mensajería. Si el sistema de mensajería cambia, solo es necesario modificar el endpoint, no las aplicaciones.
Un endpoint puede servir para enviar o recibir mensajes, o ambas tareas.
Patrones de Diseño de Mensajería
Los patrones describen un problema y qué hacer para solucionarlo.
- Los patrones permiten tomar decisiones que conduzcan a una buena solución, sin necesidad de tener un conocimiento o experiencia para desarrollar una solución particular.
Point to Point (Punto a Punto)
Este tipo de colas permite asegurar que solamente un receptor recibirá un mensaje particular.
- Si más de un receptor intenta obtener un mensaje (Competing Consumers), el sistema de mensajería asegura que solo uno podrá obtener un mensaje a la vez.
Publish Subscribe (Publicar/Suscribir)
Una aplicación se suscribe para recibir solo mensajes que cumplan ciertas condiciones.
- Cuando una aplicación publica un mensaje, una copia de este es entregada a todas las aplicaciones suscritas.
Request Reply (Solicitud/Respuesta)
Permite que una aplicación pueda enviar un mensaje y esperar la respuesta desde el receptor.
- Puede ser implementado tanto en modalidad síncrona como asíncrona.
- Utiliza una cola para el requerimiento (request) y otra para la respuesta (reply).
Reply to Q (Cola de Respuesta)
Para evitar tener fija (hardcodeada) la cola de respuesta, el mensaje de requerimiento debe indicar cuál es la cola donde desea la respuesta.
- Implementa el mismo concepto del campo Reply-To de un mensaje de correo electrónico.
Correlation ID (ID de Correlación)
Cuando llega una respuesta, ¿cómo sabe el emisor que esa respuesta corresponde al requerimiento previamente enviado?
- Para solucionarlo, cada mensaje debe contener un correlativo único (correlation id). El receptor debe replicar el identificador en el mensaje de respuesta.
Manejo de Errores y Mensajes Especiales
Mensajes Inválidos
En teoría, una aplicación espera cierto tipo de datos con un formato dado.
- Si la aplicación receptora no puede procesar el mensaje debido a que la data asociada no es válida, se envía ese mensaje a una cola especial.
- Esta cola actúa como log, permitiendo identificar situaciones anómalas.
Dead Letter (Mensaje No Entregable)
Si una aplicación no puede procesar un mensaje, este se deja en una cola de mensajes inválidos.
- Sin embargo, puede ocurrir que este mensaje no pueda ser entregado. En tal caso, este mensaje es derivado a una cola especial llamada Dead Letter.
