Modèle à messages

Transcription

Modèle à messages
Modèle à messages
Daniel Hagimont
IRIT/ENSEEIHT
2 rue Charles Camichel - BP 7122
31071 TOULOUSE CEDEX 7
Remerciements
André Freyssinet
[email protected]
http://hagimont.perso.enseeiht.fr
1
Plan

Principes généraux
 Les intergiciels à message (MessageOriented Middleware)
• Message passing, queuing
• Publish/subscribe
• Events
 Implantation des MOM

Application dans l'environnement Java
 Java Message Service (JMS)
2
Modèle à messages
Introduction

Modèle client-serveur





Appels synchrones
Bon pour des composants fortement couplés
Désignation explicite du destinataire
Connexion 1-1
Modèle à message
 Communications asynchrones
 Désignation anonyme (ex : annonce sur un newsgroup)
 Connexion 1-N
3
Modèle à messages Introduction

Exemple d’application
 Surveillance des équipements d’un réseau
 Évolution des équipements et de l’état des équipements

Solution client-serveur
 Interrogation régulière

Solution messages
 Émission de notifications des changements
 Les administrateurs s’abonnent à ces notifications
4
Intergiciels à messages
… utilisé tous les jours


Les forums
électroniques (News)
 technologie pull
 le consommateur
s ’abonne à un forum
 le producteur publie
une information dans
un forum
 le consommateur va
lire le contenu du
forum quand il le
souhaite



Le courrier électronique
 technologie push
 listes de diffusion (multicast publish/subscribe)
 le consommateur s ’abonne à
une liste de diffusion
 le producteur envoie un
message à tous les abonnées
de la liste
 le consommateur reçoit les
messages sans avoir à faire
d’action
Asynchrone
Anonyme
1-N
5
Intergiciels à messages
Principes directeurs




Message Passing (communication par messages)
Message Queuing (communication par file de
message)
Publish/Subscribe (communication par
abonnements)
Events (communication événementielle)
6
Intergiciels à messages
Message passing

Principes directeurs
 communication asynchrone
 communication directe ou indirecte (via des “portes”)
• problème de désignation, localisation des entités
coopérantes
 messages éventuellement typés (ex: Mach)

Interface de programmation et mise en œuvre
 primitives de communication élémentaires ("envoyer",
"recevoir")
• dans une architecture de type micro-noyau : Chorus, Mach
• dans un environnement de programmation parallèle : PVM,
MPI

Outils de développement
 peu évolués et de bas niveau
7
Intergiciels à messages
Message passing - Extensions

Communication de groupe
 groupe : ensemble de
récepteurs identifiés par
un nom unique
 gestion dynamique du
groupe : arrivée/départ de
membres
 différentes propriétés sur
l'ordre
 mise en œuvre : utilisation
possible de IP multicast
 applications : tolérance
aux fautes (gestion de la
réplication), travail
coopératif

Communication anonyme
 désignation associative :
les récepteurs d'un
message sont identifiés
par leurs propriétés et pas
par leur nom
 propriété : attribut du
message ou identificateur
externe
 indépendance entre
émetteur et récepteurs
8
Intergiciels à messages
Message Queuing

Queue de messages
 persistantes ⇒ asynchronisme et fiabilité
Client
Serveur
send

recv
Indépendance de l'émetteur et du destinataire
 Le destinataire n’est pas forcément actif
9
Intergiciels à messages
Publish/Subscribe

Désignation anonyme
 L’émetteur envoie un message
• Basé sur un sujet (subject-based)
• Basé sur un contenu (content-based)
 Le récepteur s’abonne (à un sujet ou un contenu)

Communication 1-N
 Plusieurs récepteurs peuvent s’abonner
10
Intergiciels à messages
Publish/Subscribe
consommateur
producteur
publish
subscribe



recv
11
Intergiciels à messages
Events


Concepts de base : événements, réactions (traitements associés à
l’occurrence d’un événement)
Principe d’attachement : association dynamique entre un type
d’événement et une réaction
processus_a
processus_b
Infrastructure
intermédiaire
abonnement (évt., réaction)
émission (évt)

base
événement
base
abonnement
exec (réaction)
Valable pour du Message Passing, du Message Queuing, ou du
Publish/Subscribe
12
Intergiciels à messages
Events

Par exemple pour du Publish/Subscribe
consommateur
producteur
publish
subscribe



react
13
Intergiciels à messages
Implantation

Serveur centralisé
(Hub & spoke)
 Simplicité de
mise en œuvre
 Peu tolérant aux
pannes
 Passage à
l’échelle difficile
client
client
Serveur
client
client
14
Intergiciels à messages
Implantation

Serveur réparti (Snow
flake)
 Chaque serveur connaît
un ensemble d’autres
serveurs
 Routage des messages
 Répartition de la charge
 Fiabilité relative
 Passage à l’échelle
client
client
client
serveur
serveur
client
serveur
serveur
client
15
Intergiciels à messages
Implantation

Service réparti (bus logiciel)
 Très proche de l’architecture Snow
flake
 Les serveurs se connaissent tous
 Adapté aux LANs
Processus_a
Processus_b
Interface Bus
Services du
bus logiciel
Interface Bus
protocoles du
bus logiciel
Services du
bus logiciel
Système d’
exploitation
Système d’
exploitation
Machine A
Machine B
16
Java Message Service

JMS : API Java d'accès uniforme aux systèmes de
messagerie
 IBM MQSeries
 Novell, Oracle, Sybase
 Tibco
 Message Queue
 Publish/Subscribe
 Evénements
17
JMS : une interface
Client
Client
Client
JMS
Provider X
JMS
Client
Client
JVM
MQ X
Provider Y
JVM
MQ X
MQ X
MQ X
18
Interface JMS







ConnectionFactory : objet pour créer une connexion avec
un serveur JMS
Connection : une connexion active avec un serveur JMS
Destination : une destination ou une source
Session : un contexte mono-thread pour émettre ou
recevoir
MessageProducer : un objet pour émettre dans une session
MessageConsummer : un objet pour recevoir dans une
session
Les implantations dépendent des fournisseurs …
19
JMS - Architecture
JNDI
Destination
JMS Client
ConnectionFactory
+
MessageProducer
Connection
+
MessageConsummer
Session
20
Interfaces PTP et P/S
Point-To-Point
Publish/Subscribe
ConnectionFactory
QueueConnectionFactory
TopicConnectionFactory
Connection
QueueConnection
TopicConnection
Destination
Queue
Topic
Session
QueueSession
TopicSession
MessageProducer
QueueSender
TopicPublisher
MessageConsumer
QueueReceiver
TopicSubscriber
21
JMS - Message
 Entête
 JMSDestination, JMSDeliveryMode, JMSMessageId,
JMSExpiration, JMSPriority, etc.
 Propriétés
 Couple <nom, valeur>
 Corps
 TextMessage, MapMessage
 StreamMessage, ObjectMessage
 BytesMessage
22
JMS - "Point-to-Point"
Emetteur
Messaging
QueueConnectionFactory
Destinataire
Queue
QueueConnection
QueueConnection
QueueSession
QueueSession
QueueConnectionFactory connectionFactory =
(QueueConnectionFactory) naming_service.lookup("…");
Queue queue = (Queue) naming_service.lookup("…");
QueueConnection connection = connectionFactory.createQueueConnection();
QueueSession session = connection.createQueueSession(…);
23
JMS - "Point-to-Point"
Emetteur
Messaging
QueueConnectionFactory
Destinataire
Queue
QueueConnection
QueueConnection
QueueSession
QueueSession
+
QueueSender
QueueSender sender = session.createSender(queue);
24
JMS - "Point-to-Point"
Emetteur
Messaging
QueueConnectionFactory
Destinataire
Queue
QueueConnection
QueueConnection
QueueSession
QueueSession
+
QueueSender
+
QueueReceiver
String selector = new String("(name = 'Bull') or (name = 'IBM'))");
QueueReceiver receiver = session.createReceiver(queue, selector);25
JMS - "Point-to-Point"
Emetteur
Messaging
QueueConnectionFactory
Destinataire
Queue
QueueConnection
QueueConnection
QueueSession
QueueSession
+
send
+
QueueSender
TextMessage msg = session.createTextMessage();
msg.setStringProperty("name","Bull");
msg.setText("…");
sender.send(msg);
QueueReceiver
26
JMS - "Point-to-Point"
Emetteur
Messaging
QueueConnectionFactory
Destinataire
Queue
QueueConnection
QueueConnection
QueueSession
QueueSession
+
send
QueueSender
+
receive
QueueReceiver
TextMessage msg = (TextMessage) receiver.receive();
27
JMS - "Publish/Subscribe"
Emetteur
Messaging
Destinataire
TopicConnectionFactory
Topic
TopicConnection
A
TopicSession
x
TopicConnection
B
y
TopicSession
TopicConnectionFactory connectionFactory =
(TopicConnectionFactory) naming_service.lookup("…");
Topic topic = (Topic) naming_service.lookup("/A/x");
TopicConnection connection = connectionFactory.createTopicConnection();
TopicSession session = connection.createTopicSession(…);
28
JMS - "Publish/Subscribe"
Emetteur
Messaging
Destinataire
TopicConnectionFactory
Topic
TopicConnection
A
TopicSession
x
TopicConnection
B
y
TopicSession
+
TopicPublisher
TopicPublisher publisher = session.createPublisher(topic);
29
JMS - "Publish/Subscribe"
Emetteur
Messaging
Destinataire
TopicConnectionFactory
Topic
TopicConnection
A
TopicSession
x
TopicConnection
B
TopicSession
y
+
TopicPublisher
+
TopicSubscriber
Listener
TopicSubscriber subscriber =
session.createSubscriber(topic);
Subscriber.setMessageListener(listener);
30
JMS - "Publish/Subscribe"
Emetteur
Messaging
Destinataire
TopicConnectionFactory
Topic
TopicConnection
A
TopicSession
publish
x
+
TopicPublisher
TopicConnection
B
TopicSession
y
+
TopicSubscriber
Listener
publisher.publish(msg);
31
JMS - "Publish/Subscribe"
Emetteur
Messaging
Destinataire
TopicConnectionFactory
Topic
TopicConnection
A
TopicSession
publish
x
+
TopicConnection
B
TopicSession
y
+
TopicPublisher
TopicSubscriber
Listener
void onMessage(Message msg) throws JMSException
{
// unpack and handle the message
}
onMessage
32
JMS – les messages

TextMessage (une chaîne de caractères)
String data;
TextMessage message = session.createTextMessage();
message.setText(data);
String data;
data = message.getText();

BytesMessage (tableau de bytes)
byte[] data;
BytesMessage message = session.createByteMessage();
message.writeBytes(data);
byte[] data;
int length;
length = message.readBytes(data);
33
JMS – les messages

MapMessage (une suite de paire nom-valeur)
 une valeur est un type primitif
MapMessage message = session.createMapMessage();
message.setString("Name", "…");
message.setDouble("Value", doubleValue);
message.setLong("Time", longValue);
String name = message.getString("Name");
double value = message.getDouble("Value");
long time = message.getLong("Time");
34
JMS – les messages

StreamMessage (série de valeurs)
 une valeur est un type primitif
 La lecture doit respecter l'ordre de l'écriture
StreamMessage message = session.createStreamMessage();
message.writeString("…");
message.writeDouble(doubleValue);
message.writeLong(longValue);
String name = message.readString();
double value = message.readDouble();
long time = message.readLong();
35
JMS – les messages

ObjectMessage (objet sérialisé)
ObjectMessage message = session.createObjectMessage();
message.setObject(obj);
obj = message.getObject();
36
Conclusions

Communication par messages
 Modèle de programmation simple…
 possédant de nombreuses extensions, variantes, …
• bus logiciel à messages, modèles d’acteurs, plates-formes
à agents, systèmes multi-agents, ...
 très utilisé pour relier entre eux des « outils », existant,
indépendants, …

Attention… la simplicité ne peut être
qu’apparente
 propagation et récupération des erreurs
 outils de développement
37