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