Modèle à messages Daniel Hagimont IRIT/ENSEEIHT 2 rue Charles Camichel - BP 7122 31071 TOULOUSE CEDEX 7 Daniel.Hagimont@enseeiht.fr http://hagimont.perso.enseeiht.fr Remerciements André Freyssinet 1
Plan Principes généraux Les intergiciels à message (Message- Oriented 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 producteur publish consommateur 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 émission (évt) Infrastructure intermédiaire base événement base abonnement abonnement (évt., réaction) exec (réaction) processus_b Valable pour du Message Passing, du Message Queuing, ou du Publish/Subscribe 12
Intergiciels à messages Events Par exemple pour du Publish/Subscribe producteur publish consommateur 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 serveur serveur client 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 Interface Bus Services du bus logiciel Système d exploitation Machine A protocoles du bus logiciel Processus_b Interface Bus Services du bus logiciel Système d exploitation 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 JMS Provider X Client Client Provider Y JVM JVM MQ X 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 JMS Client Destination ConnectionFactory Connection Session + + MessageProducer MessageConsummer 20
Interfaces PTP et P/S ConnectionFactory Connection Destination Session MessageProducer MessageConsumer Point-To-Point QueueConnectionFactory QueueConnection Queue QueueSession QueueSender QueueReceiver Publish/Subscribe TopicConnectionFactory TopicConnection Topic TopicSession TopicPublisher 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 QueueConnection Messaging QueueConnectionFactory Queue Destinataire 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 QueueConnection Messaging QueueConnectionFactory Queue Destinataire QueueConnection QueueSession QueueSession + QueueSender QueueSender sender = session.createsender(queue); 24
JMS - "Point-to-Point" Emetteur QueueConnection Messaging QueueConnectionFactory Queue Destinataire 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 QueueConnection Messaging QueueConnectionFactory Queue Destinataire QueueConnection QueueSession QueueSession send + + QueueSender QueueReceiver TextMessage msg = session.createtextmessage(); msg.setstringproperty("name","bull"); msg.settext(" "); sender.send(msg); 26
JMS - "Point-to-Point" Emetteur Messaging QueueConnectionFactory Destinataire Queue QueueConnection QueueConnection QueueSession QueueSession send + + receive QueueSender QueueReceiver TextMessage msg = (TextMessage) receiver.receive(); 27
JMS - "Publish/Subscribe" Emetteur Messaging TopicConnectionFactory Destinataire TopicConnection Topic TopicConnection A B TopicSession x 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 TopicConnectionFactory Destinataire TopicConnection Topic TopicConnection A B TopicSession x y TopicSession + TopicPublisher TopicPublisher publisher = session.createpublisher(topic); 29
JMS - "Publish/Subscribe" Emetteur Messaging TopicConnectionFactory Destinataire TopicConnection Topic TopicConnection A B TopicSession x y TopicSession + + TopicPublisher TopicSubscriber Listener TopicSubscriber subscriber = session.createsubscriber(topic); Subscriber.setMessageListener(listener); 30
JMS - "Publish/Subscribe" Emetteur Messaging TopicConnectionFactory Destinataire TopicConnection Topic TopicConnection A B TopicSession x y TopicSession publish + + TopicPublisher TopicSubscriber Listener publisher.publish(msg); 31
JMS - "Publish/Subscribe" Emetteur Messaging TopicConnectionFactory Destinataire TopicConnection Topic TopicConnection A B TopicSession x y TopicSession publish + + 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