Download Presentación de PowerPoint - Departamento de Ingeniería Telemática

Document related concepts
no text concepts found
Transcript
Middleware: modelos de comunicación
Marisol García Valls
Arquitecturas Distribuidas
2º Ingeniero de Telecomunicación (Telemática)
Departamento de Ingeniería Telemática
Universidad Carlos III de Madrid
[email protected]
2
Índice
•
Modelos de middleware para mensajería
•
Modelo punto a punto
•
Modelo cliente-servidor
•
Modelo de publicación-subscripción
•
Java Message Service (JMS)
©2008 Marisol García Valls
Arquitecturas Distribuidas
Introducción
3
Aplicación
Middleware
Aplicación
Middleware
Network Stack (IP)
Hardware (Ethernet, etc.)
Sistema Operativo
Network Stack
(IP)
Hardware
(Ethernet, etc.)
Otro HW
•
El middleware es una capa de software entre la aplicaicón y el sistema operativo.
•
El middleware de red
– aísla a la aplicación de los detalles de la arquitectura de la máquina subyacente, del
SO y de la pila de red.
– simplifica el desarrollo de sistemas distribuidos permitiendo a las aplicaciones que
envíen y reciban información sin tener que programar usando protocolos de más
bajo nivel (como sockets y TCP o UDP/IP).
©2008 Marisol García Valls
Arquitecturas Distribuidas
4
Modelos de comunicación de red
•
Cliente-servidor (client-server). Muchos a uno.
•
Punto a punto (point-to-point). Uno a uno.
•
Publicador-suscriptor (publish-subscribe). Centrado en los datos, eventos, etc.
•
El modelo de comunicación tiene impacto en:
–
–
–
–
•
el
la
la
la
rendimiento,
facilidad para satisfacer distintas transacciones de comunicación,
naturaleza de la detección de errores, y
robustez frente a diferentes condiciones de error.
No se cumple que un modelo sea bueno para todos (NOT one size fits all).
©2008 Marisol García Valls
Arquitecturas Distribuidas
5
Algunos de los principales modelos de middleware
•
Mensajería
– JMS (Java Messaging Service)
– Comunicación entre aplicaciones Java a través de mensajes
•
Publicador-subscriptor
–
–
–
–
DDS (Real-Time Data Distribution Service)
Comunicación entre aplicaciones (interfaz C y Java)
Permite establecer otros parámetros de “rendimiento” en la comunicación
Sirve para crear aplicaciones distribuidas de tiempo real
©2008 Marisol García Valls
Arquitecturas Distribuidas
Características del middleware para mensajería
6
•
La mensajería es un método de comunicación entre componentes software o
aplicaciones.
•
Un mensaje (a nivel del middleware) es una facilidad P2P (entre procesos
iguales).
•
Un cliente de mensajería puede enviar y recibir mensajes de otros clientes.
•
Cada cliente conecta a un agente de mensajería que ofrece facilidades para
crear, enviar, recibir y leer mensajes.
•
La mensajería permite comunicación distribuida débilmente acoplada.
–
–
–
–
–
Un componente envía un mensaje a una destinación.
El receptor puede coger el mensaje de la destinación.
Sin embargo, emisor y receptor no tienen por qué estar disponibles a la vez.
El emisor puede no saber nada acerca del receptor y viceversa.
Sólo deben conocer qué formato de mensaje y qué destinación deben usar.
©2008 Marisol García Valls
Arquitecturas Distribuidas
Mensajería vs. Invocación remota
7
•
La invocación remota (p.ej., RMI en el caso de Java) es una tecnología
fuertemente acoplada.
•
RMI fuerza que una aplicación conozca los métodos remotos que va a invocar.
•
La mensajería también difiere del correo electrónico que es un método de
comunicación entre personas o entre aplicaciones software y personas.
•
La mensajería se usa para comunicar entre aplicaciones software o componentes
software.
©2008 Marisol García Valls
Arquitecturas Distribuidas
8
Comparación de invocación remota con mensajería
Cliente
Servidor
Invocación
Recibe invocación
Procesa invocación y genera respuesta
Devuelve respuesta
Sigue
Ejecuta
Decide recibir datos/conecta a un tipo de datos
Procesa datos
Le envían datos del tipo subscrito
Envía datos
Sigue
A través de un
servidor o
directamente a
los que están
subscritos
©2008 Marisol García Valls
Ejecuta
Decide recibir datos/conecta a un tipo de datos
Le envían datos del tipo subscrito
Procesa datos
Arquitecturas Distribuidas
9
Ventajas del middleware de mensajería
•
Mayor independencia (desacoplamiento).
•
Puede manejar complejos patrones de flujos de información.
•
Permite obtener aplicaciones distribuidas más simples y modulares.
•
Puede manejar automáticamente todo tipo de tareas de red (conexiones, fallos,
cambios de red) eliminando tener que programar todos estos casos especiales.
O. O
invocación
recepción
respuesta
Sockets
•
El tratamiento de casos especiales lleva más del 80% del trabajo y del código.
•
Ejemplos: televisión, revistas y periódicos.
©2008 Marisol García Valls
Arquitecturas Distribuidas
10
JMS: Java Message Service
•
Es un middleware de mensajería de SUN con API Java para que las aplicaciones
creen, envíen, reciban y lean mensajes.
•
La primera versión data de 1998. La última es la v1.0.2b de agosto de 2001
http://www.java.sun.com/products/jms
Características principales:
•
Comunicación débilmente acoplada (loosely coupled).
•
Comunicación asíncrona:
– Un proveedor de mensajes los entrega a un cliente tal como llegan.
– Un cliente no tiene que pedir los mensajes para recibirlos.
•
Comunicación fiable:
– JMS garantiza que los mensajes son entregados una vez (y sólo una).
– JMS puede ofrecer menores niveles de fiabilidad para aplicaciones que puedan
permitirse perder mensajes o recibir duplicados.
©2008 Marisol García Valls
Arquitecturas Distribuidas
11
Ejemplo de aplicación con mensajería
Fabrica
producto x, n
unidades
Componente
Inventario
Producto
Componente
ensamblado
producto
Piezas
requeridas
a,…,n
Producto x
Unidades n
Componente
Catálogo
Componente
fabricación
piezas
Inventariar
piezas
fabricadas a,…,n
Componente
contabilidad
©2008 Marisol García Valls
Piezas a,…,x
Componente
inventario
piezas
Arquitecturas Distribuidas
12
Conceptos básicos del API JMS
•
Arquitectura del API de JMS
•
Dominios de mensajería
•
Consumo de mensajes
©2008 Marisol García Valls
Arquitecturas Distribuidas
13
Arquitectura del API de JMS
•
Una aplicación con JMS tiene 5 componentes principales.
•
Proveedor JMS: un sistema de mensajería que implementa las interfaces JMS y
ofrece características para su control y administración.
•
Clientes JMS: programas o componentes SW escritos en Java que producen y
consumen mensajes.
•
Mensajes: objetos que comunican información entre clientes JMS.
•
Objetos administrados: objetos JMS preconfigurados que se crean por un
administrador para ser utilizados por los clientes. Hay dos tipos:
– Destinaciones (destinations)
– Factorías de conexiones (connection factories)
•
Clientes nativos: son programas que utilizan un producto de mensajería con API
para clientes nativos en lugar del API JMS.
©2008 Marisol García Valls
Arquitecturas Distribuidas
14
Arquitectura del API de JMS
•
Las herramientas de administración permiten vincular destinaciones y factorías de
•
Los clientes JMS pueden entonces:
conexiones dentro del espacio de nombres JNDI (Java Naming Directory Interface).
– buscar los objetos administrados en el espacio de nombres, y
– establecer la conexión lógica a dicho objeto mediante el proveedor JMS.
Herramienta de
administración
Vincular (bind)
Espacio de nombres
JNDI
CF
D
Buscar (Lookup)
Cliente JMS
©2008 Marisol García Valls
Conexión
lógica
Proveedor
JMS
Arquitecturas Distribuidas
15
Dominios de mensajería
•
La mayoría de implementaciones del API de JMS soportan los dominios:
– Punto a punto
– Publicador – subscriptor
•
Algunos clientes JMS combinan el uso de ambos dominios en la misma aplicación.
©2008 Marisol García Valls
Arquitecturas Distribuidas
16
Esquema del dominio de mensajería punto a punto
•
El middleware punto a punto (PTP) se sustenta en el concepto de:
– Colas de mensajes
– Emisores
– Receptores
•
Cada mensaje se envía y dirige a una cola específica.
•
Los clientes receptores extraen mensajes de la cola/-s establecida/-s para mantener sus
mensajes.
•
Las colas retienen todos los mensajes que les son enviados hasta que:
– Son consumidos, o
– Expiran
Cliente 1
Msj.
Msj.
Envía
Cola
Consume
Cliente 2
Asiente
•
Cada mensaje sólo tiene un consumidor.
•
No hay dependencias temporales entre emisor y receptor (pueden funcionar indepen.)
•
El receptor asiente al procesar un mensaje satisfactoriamente.
•
Se usa PTP cuando cada mensaje que se envía sólo debe ser procesado por un consumidor.
©2008 Marisol García Valls
Arquitecturas Distribuidas
17
Dominio de mensajería publicador-suscriptor
•
Las aplicaciones (nodos) se suscriben a los datos que necesitan.
•
Las aplicaciones publican los datos que quieren compartir.
•
Los clientes envían un mensaje a un tópico o tema (topic).
•
Generalmente los publicadores (P) y los subscriptores (S) son anónimos.
•
Publicadores y subscriptores pueden publicar o subscribirse a la jerarquía de contenidos
de forma dinámica.
•
El sistema se encarga de distribuir los mensajes que llegan desde los múltiples
publicadores de un tópico a los múltiples subscriptores de ese tópico.
•
Los tópicos retienen los mensajes sólo durante el tiempo que se tarda en
distribuirlos a los subscriptores actuales.
•
Implementaciones de PS:
– A través de un servidor central (JMS)
– Los datos pasan directamente entre los publicadores y los suscriptores (DDS)
©2008 Marisol García Valls
Arquitecturas Distribuidas
18
Esquema del dominio de mensajería publicador-suscriptor
•
Cada mensaje puede tener múltiples consumidores.
•
Publicadores y subscriptores tienen dependencias temporales.
– Un cliente que se subscribe a un tópico sólo puede consumir mensajes publicados después de
que el cliente haya creado la subscripción,
– El subscriptor debe estar activo para poder consumir mensajes
Se subscribe
Entrega
Cliente 1
Publica
Tópico
Msj.
Cliente 2
Msj.
Se subscribe
Entrega
Cliente 3
Msj.
•
Se usa en situaciones en las que cada mensaje pueda ser procesado por cero, uno o muchos
consumidores.
©2008 Marisol García Valls
Arquitecturas Distribuidas
19
Consumo de mensajes
•
Los middleware de mensajería son inherentemente asíncronos.
•
Fundamentalmente no existe dependencia temporal entre la producción y la
consumición de un mensaje.
•
Sin embargo, JMS utiliza este término en un sentido más preciso diciendo que los
mensajes puede ser consumidos de forma síncrona y asíncrona.
•
Síncrona:
– Un subscriptor o receptor coge un mensaje de forma explícita desde la destinación
invocando un método receive.
– El método receive puede bloquearse hasta que un mensaje llega o puede expirar
su tiempo de espera si un mensaje no llega dentro de un tiempo especificado.
•
Asíncrona:
– Un cliente puede registrar un escuchador de mensajes (message listener), que
es similar a un escuchador de eventos (event listener)
– Cuando el mensaje llega a la destinación, el proveedor JMS entrega el mensaje
llamando al método del escuchador onMessage.
– El método onMessage actúa según el contenido del mensaje.
©2008 Marisol García Valls
Arquitecturas Distribuidas
20
El modelo de programación del API de JMS
Sus bloques básicos son:
•
•
Factoría de
conexiones
Objetos administrados:
factorías de conexiones y
destinaciones
Crea
Conexión
Conexiones
Crea
•
Sesiones
•
Productores de mensajes
Productor
mensaje
Envía a
Crea
Crea
Consumidor
mensaje
Recibe de
Mensajes
©2008 Marisol García Valls
Msj.
Destinación
•
Sesión
Consumidores de mensajes
Destinación
•
Crea
Arquitecturas Distribuidas
21
Objetos administrados
•
Son los bloques: destinaciones y factorías de conexiones.
•
Nota: ambos se mantienen mejor de forma administrativa que programática.
•
Los clientes JMS acceden a estos objetos a través de interfaces portables.
•
Los administradores configuran los objetos administrados en un espacio de
nombres JNDI.
•
Entonces, los clientes buscan los objetos administrados utilizando el API de JNDI.
•
Notas: en la plataforma J2EE (Java para aplicaciones empresariales) las tareas de
administración se realizan mediante j2eeadmin (sin argumentos).
©2008 Marisol García Valls
Arquitecturas Distribuidas
22
Factorías de conexiones
•
Una factoría de conexiones es un objeto utilizado por un cliente para crear una conexión
con un proveedor.
•
Encapsula parámetros de configuración definidos por un administrador.
•
Hay dos factorías de conexiones que vienen preconfiguradas en el J2EE SDK y son accesibles
al arrancar el servicio.
•
Cada factoría de conexión es una instancia de una interfaz QueueConnectionFactory
TopicConnectionFactory.
•
Se pueden crear nuevas factorías de conexiones:
o
j2eeadmin –addJmsFactory jndi_name queue
j2eeadmin –addJmsFactory jndi_name topic
•
Un cliente al inicio realiza una búsqueda de una factoría de conexión con el API JNDI:
Context ctx = new InitialContext();
Resulta en una búsqueda en el classpath actual por un fichero
específico (vendor-specific) llamada jndi.properties, que indica
qué implementación del API y qué espacio de nombres utilizar
QueueConnectionFactory queueConnectionFactory =
(QueueConnectionFactory) ctx.lookup(“QueueConnectionFactory”);
TopicConnectionFactory topicConnectionFactory =
(TopicConnectionFactory) ctx.lookup(“TopicConnectionFactory”);
©2008 Marisol García Valls
Arquitecturas Distribuidas
23
Destinaciones o destinatario
•
Un destinatario es el objeto que utiliza un cliente para especificar el destino
de los mensajes que produce y la fuente de los mensajes que consume.
•
En el modelo PTP los destinatarios se llaman colas. Se crean:
j2eeadmin –addJmsDestination queue_name queue
•
En el modelo PS los destinatarios se llaman tópicos. Se crean:
j2eeadmin –addJmsDestination topic_name topic
•
Una aplicación JMS puede usar múltiples colas y/o tópicos.
•
Búsqueda de tópicos creados:
Topic myTopic = (Topic) ctx.lookup(“Topico”);
•
Búsqueda de una cola y su asignación a un objeto Queue:
Queue myQueue = (Queue) ctx.lookup(“LaCola”);
©2008 Marisol García Valls
Arquitecturas Distribuidas
24
Conexiones
•
Una conexión encapsula una conexión virtual con un proveedor JMS.
•
Puede representar una conexión TCP/IP con un socket entre un cliente y un
servidor (residente).
•
Como las factorías de conexiones vienen, las conexiones también pueden usar los
dos dominios de mensajería: TopicConnection o QueueConnection.
TopicConnection topicConnection =
topicConnectionFactory.createTopicConnection();
QueueConnection queueConnection =
queueConnectionFactory.createQueueConnection();
•
Al acabar una aplicación se debe cerrar las conexiones creadas. Esto cierra también
sus sesiones, productores y consumidores de mensajes:
queueConnection.close();
topicConnection.close();
©2008 Marisol García Valls
Arquitecturas Distribuidas
25
Sesiones
•
Una sesión es un componente de un único hilo para producir y consumir mensajes.
•
Se usan para crear productores, consumidores y mensajes.
•
Las sesiones gestionan la ejecución de escuchadores de mensajes.
•
Una sesión ofrece un entorno transaccional para agrupar un conjunto de envíos y
recepciones en una unidad atómica de trabajo.
•
Al igual que las conexiones, las sesiones pueden implementar las interfaces para utilizar PTP
(QueueSession) o PS (TopicSession):
TopicSession topicSession =
topicConnection.createTopicSession(false,Session.AUTO_ACKNOWLEDGE);
La sesión no es
transaccional
•
La sesión automáticamente asiente los mensajes
cuando son recibidos satisfactoriamente
Para crear la sesión para el modelo PS (con colas):
QueueSession = queueConnection.createQueueSession(true, 0);
La sesión se
transacciona
©2008 Marisol García Valls
El asentimiento a los mensajes no es especifica
para sesiones transaccionadas
Arquitecturas Distribuidas
26
Productores de mensajes
•
Un productor de mensajes es un objeto creado por una sesión para enviar mensaje
a una destinación.
•
Para PTP: un productor implementa la interfaz QueueSender.
•
Para PS implementa la interfaz TopicPublisher.
•
Se utiliza una QueueSession para crear un productor para la cola myqueue:
QueueSender queueSender = queueSession.createSender(myQueue);
•
Y use usa un TopicSession para crear un publicador para el tópico mytopic:
TopicPublisher topicPublishr = topicSession. createPublisher(myTopic);
•
Se puede crear publicadores no identificados con null.
•
Para enviar (primero hay que crear los mensajes):
– PTP con método send: queueSender.send(message);
– PS con método publish: topicPublishr.publish(message);
©2008 Marisol García Valls
Arquitecturas Distribuidas
27
Consumidores de mensajes
•
Un productor de mensajes es un objeto creado por una sesión para recibir mensajes que han sido
enviados a una destinación.
•
Un consumidor permite que un cliente JMS registre interés en una destinación con un proveedor JMS.
•
El proveedor JMS gestiona la entrega de mensajes desde una destinación a los consumidores
registrados a esa destinación.
•
Para PTP un consumidor implementa la interfaz
QueueReceiver.
•
Para PS un consumidor implementa la interfaz
TopicSubscriber.
•
Se utiliza una QueueSession para crear un receptor para la cola myqueue:
QueueReceiver queueReceiver = queueSession.createReceiver(myQueue);
•
Y usa un TopicSession para crear un publicador para el tópico mytopic:
TopicSubscriber topicSubscriber = topicSession.createSubscriber(myTopic);
•
Una vez creado, el consumidor estará activo. Se desactiva con close.
•
La entrega de mensajes no comienza hasta que no se arranca la conexión con start y para
consumir tanto para PTP como PS se utiliza el método receive:
queueConnection.start();
Message m = queueReceiver.receive();
topicConnection.start();
Message m = topicSubscriber.receive(1000); // time out para recepción
©2008 Marisol García Valls
Arquitecturas Distribuidas
28
Escuchadores de mensajes
•
Es un objeto que actúa como un manejador de eventos asíncronos para mensajes.
•
Implementa la interfaz MessageListener.
• MessageListener contiene un solo método: onMessage() que define las
acciones a tomar cuando llega un mensaje.
•
El escuchador se debe registrarse a una cola de mensajes o a un gestor
de tópicos con el método setMessageListener:
TopicListener topicListener = new TopicListener();
topicSubscriber.setMessageListener(topicListener);
•
Después de registrar el escuchador se debe arrancar (start) la cola o el gestor de
tópico para comenzar la entrega de mensajes.
©2008 Marisol García Valls
Arquitecturas Distribuidas
29
Mensajes: Cabeceras
•
Un mensaje JMS tiene tres partes: cabecera, propiedades y cuerpo. Sólo la cabecera es obligatoria.
•
La cabecera contiene campos predefinidos con valores utilizados por clientes y proveedores para
identificar y redirigir a los mensajes:
Header field
Set By
JMSDestination
Send or publish method
JMSDeliveryMode
Send or publish method
JMSExpiration
Send or publish method
JMSPriority
Send or publish method
JMSMessageID
Send or publish method
JMSTimestamp
Send or publish method
JMSCorrelationID
Client
JMSReplyTo
Client
JMSType
Client
JMSRedelivered
JMS Provider
•
Cada mensaje tiene un identificador único: JMSMessageID
•
JMSDestination representa la cola o el tópico al que se envía el mensaje.
•
Cada campo de la cabecera tiene métodos get y set (documentados en la interfaz Message)
•
Algunos campos los debe establecer un cliente, otros son automáticamente establecidos por el método
send o publicar, que rescriben cualquier valor establecido por el cliente.
©2008 Marisol García Valls
Arquitecturas Distribuidas
30
Propiedades de mensajes
•
Existen dos tipos de propiedades:
– Definidas por el usuario
– Predefinidas por el API JMS
•
Se pueden crear y establecer propiedades de mensajes si se necesitan otros
valores además de los contenidos en los campos de la cabecera.
•
Utilidad de las propiedades:
– compabilidad con otros sistemas de mensajería, o
– establecer filtros (message selectors)
•
El API de JMS ofrece algunas propiedades predefinidas que un proveedor
puede soportar.
•
La utilización de las propiedades predefinidas o de las propiedades definidas por
el usuario es opcional.
©2008 Marisol García Valls
Arquitecturas Distribuidas
31
Cuerpo de los mensajes
•
El API de JMS define cinco formatos para el cuerpo de los mensajes.
•
Esto permite enviar y recibir datos en diferentes formas y ofrecer compatibilidad con otros
formatos de mensajería existentes.
•
Message Type
Body contains
TextMessage
A java.lang.String object (e.g., the contecnts of an XML file)
MapMessage
A set of name/value pairs, with names as String objects and values as primitive types in
Java. The entries can be accessed sequentially by enumeator or randomly by name.
The order of the entries is undefined.
BytesMessage
A stream of bytes. This message type is for literally encoding a body to match an
existing message format.
StreamMessage
A stream of primitive values in Java, filled and read sequentially.
ObjectMessage
A serializable object in Java.
Message
A message composed only of header fiels and properties. This message type is useful
when a message body is not required.
El API de JMS tiene métodos para crear mensajes de cada tipo y para rellenar su contenido.
©2008 Marisol García Valls
Arquitecturas Distribuidas
32
Creación y envío de mensajes. Ejemplos de métodos
•
createTextMessage() se invoca sobre sesiones (QueueSession o TopicSession) para
crear mensajes.
•
setText(String text) se invoca sobre un mensaje para introducir un contenido.
•
send(Message msg) se invoca para enviar un mensaje sobre una cola
Envío de mensaje:
TextMessage message = queueSession.createTextMessage();
message.setText(msg_text);
queueSender.send(message);
Recepción del mensaje:
Message m =queueReceiver.receive();
if (m instaceof TextMessage) {
TextMessage message = (TextMessage) m;
System.out.println(“Leyendo mensaje: “ + message.getText());
} else {
// Tratar el error
}
©2008 Marisol García Valls
Arquitecturas Distribuidas
33
Excepciones
•
La clase raíz de las excepciones de los métodos de JMS es JMSException.
•
Tiene las siguientes subclases:
–
–
–
–
–
–
–
–
–
–
–
–
IllegalStateException
InvalidClientIDException
InvalidDestinationException
InvalidSelectorException
JMSSecurityException
MessageEOFException
MessageFormatException
MessageNotReadableException
MessageNotWriteableException
ResourceallocationException
TransactionInProgressException
TransactionRolledBackException
©2008 Marisol García Valls
Arquitecturas Distribuidas