Documente Academic
Documente Profesional
Documente Cultură
Message-Oriented Middleware
Louis-Claude Canon
louis-claude.canon@univ-fcomte.fr
Bureau 414C
Introduction
JMS 2.0
AMQP 0-9-1
ZeroMQ
Perspectives et bibliographie
Plan
Introduction
JMS 2.0
AMQP 0-9-1
ZeroMQ
Perspectives et bibliographie
Intergiciel (middleware)
Contexte applicatif
Plan
Introduction
JMS 2.0
AMQP 0-9-1
ZeroMQ
Perspectives et bibliographie
Styles de communication
I Communication point-à-point :
I Les messages transitent par une file (queue).
I Chaque message n’a qu’un seul consommateur.
I Le récepteur peut consommer le message même s’il était hors-ligne
lorsque ce dernier a été émis.
I Communication publication/abonnement (publish/subscribe) :
I Les messages transitent par un sujet (topic).
I Chaque message peut avoir plusieurs consommateurs.
I Un client qui s’abonne à un sujet ne peut consommer que les messages
émis après l’abonnement.
receive
send
setMessageListener
send
onMessage
Objets principaux
Objets administrés
Connection factories
I Permet de créer une connexion auprès d’un fournisseur.
I Injection JNDI.
1 @Resource(lookup = "java:comp/DefaultJMSConnectionFactory")
2 private static ConnectionFactory connectionFactory;
Destinations
I Représente soit des files, soit des sujets.
1 @Resource(lookup = "jms/MyQueue")
2 private static Queue queue;
3
4 @Resource(lookup = "jms/MyTopic")
5 private static Topic topic;
Connexion et session
JMSContext
JMSProducer
1 context.createProducer().send(dest, message);
1 message = session.createTextMessage();
2 message.setStringProperty("NewsType", "Sports");
JMSConsumer et sujet
I Les messages seront répartis entre ceux qui ont participé à l’inscription.
Messages JMS
Type Description
TextMessage Une chaîne de caractères.
MapMessage Un ensemble de paires clé-valeur.
BytesMessage Un flot de données binaires.
StreamMessage Un flot de données primitives.
ObjectMessage Un objet sérialisé.
Message Ne contient rien.
Exceptions JMS
Exemple simplifié
Mode de session
Transaction
Persistance
Création de session
JMS 1.1 :
1 Session createSession(boolean transacted,
2 int acknowledgeMode)
3 throws JMSException;
4 // Session.AUTO_ACKNOWLEDGE, Session.CLIENT_ACKNOWLEDGE ou
5 // Session.DUPS_OK_ACKNOWLEDGE
JMS 2.0 :
1 JMSContext createContext(int sessionMode) throws JMSException;
2 // JMSContext.AUTO_ACKNOWLEDGE, JMSContext.CLIENT_ACKNOWLEDGE,
3 // JMSContext.DUPS_OK_ACKNOWLEDGE ou JMSContext.TRANSACTED
4
5 JMSContext createContext() throws JMSException;
Délai de délivrance
JMS 1.1 :
1 try (Connection conn = connFactory.createConnection()) {
2 Session session = conn.createSession();
3 MessageProducer msgProducer
4 = session.createProducer(queue);
5 msgProducer.setDeliveryDelay(20000);
6 TextMessage textMsg = session.createTextMessage("Hello");
7 msgProducer.send(textMsg);
8 }
JMS 2.0 :
1 try (JMSContext context = connFactory.createContext()) {
2 context.createProducer()
3 .setDeliveryDelay(20000)
4 .send(queue,"Hello␣world");
5 }
I Couplage faible entre les participants (ils n’ont pas tous besoin d’être
connectés au même moment).
I Fiabilité (durable, persistent).
I Performance (distribution de la charge, débit important).
Plan
Introduction
JMS 2.0
AMQP 0-9-1
ZeroMQ
Perspectives et bibliographie
JMS et AMQP
AMQP
Protocole réseau (wire-level) pour l’échange de messages sur des files :
I Définit des règles sur les valeurs binaires échangées.
I Indépendance vis-à-vis des vendeurs.
JMS
Interface de programmation (coté client) :
I Définit les fonctions permettant de contrôler le middleware.
I Les clients et le serveur JMS doivent utiliser la même implémentation.
I Le même code pourra être utilisé avec n’importe quelle implémentation.
File
Exchange
Distinction entre les exchanges (point d’arrivé des messages) et les files
(point de retrait) :
Types d’exchanges
Trois types : fanout (équivalent des sujets JMS), direct (sujets avec filtres)
et topic (sujets avec filtres avancés).
RPC
Avantages
I Répartition de la charge (rajouter des consommateurs).
I Pas besoin d’annuaire.
I Répartition des fonctions sur différents serveurs (filtres).
Plan
Introduction
JMS 2.0
AMQP 0-9-1
ZeroMQ
Perspectives et bibliographie
Particularités
I Communication directe et indirecte : on manipule des sockets, mais on
peut facilement simuler un fournisseur.
I Bilan des solutions lors du développement d’une application distribuée :
I La laisser centralisée (ne passe pas à l’échelle).
I La distribuer en utilisant directement des sockets TCP/IP (bas niveau,
nécessité de réimplémenter de nombreuses fonctionnalités).
I Stocker les données dans des bases de données (inadapté pour des
échanges dynamiques).
I Utiliser un fournisseur JMS ou AMQP (coût d’administration).
I Objectif : fournir une solution haut-niveau pour les projets modestes
avec un coût de performance et d’administration minimal.
I Couplage faible (les machines peuvent se connecter après l’envoi d’un
message).
I Schémas de communication (multicast).
I Sans fournisseur.
Plan
Introduction
JMS 2.0
AMQP 0-9-1
ZeroMQ
Perspectives et bibliographie
Historique de JMS
Historique d’AMPQ
RabbitMQ
Historique récapitulatif
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
•
0-10
•
1.0
ZMTP/1.0 2.0 3.0 3.1
ZeroMQ • • • •• • • • •
0.3 1.0 2.0 3.0 4.0
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018
Documentation officielle
Spécifique à l’implémentation
dominante du protocole, AMQP
0-9-1. Assez complémentaire avec la
documention en ligne.
ZeroMQ, 2013