AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ

Post on 27-Jun-2015

406 views 3 download

description

Avec une hétérogénéité sans cesse grandissante des systèmes d'information des entreprises, l'interopérabilité se retrouve soudainement au coeur des critères de décision. L'un des mécanismes populaires de découplage et de communication inter-systèmes repose sur l'utilisation de technologies orientées message ("message-oriented middleware"). Ces infrastructures ont longtemps été spécialisées en termes de plateforme cible (.Net, Java, etc) mais aussi non interopérable entre elles. Le standard émergent AMQP (Advanced Message Queueing Protocol) entre alors en scène, et permet de normaliser le format même du message. Ceci afin de pouvoir faire interopérer des implémentations diverses de middleware, sans surcoût de développement. Le standard AMQP a été initialement créé par des grands acteurs du monde bancaire tels que JPMorgan Chase, Goldman Sachs, Crédit Suisse, qui ont été rejoints par Microsoft, VMware, Cisco, et biens d'autres, dont Zenika. Bernard Jourdain et Pierre Queinnec présenteront donc une approche d'interopérabilité basée sur AMQP, permettant de faire communiquer un processus Java avec les technologies Microsoft (WPF), sur un cas réel simplifié, l'affichage temps réel commune par commune des résultats des élections présidentielles... 2007. Ils se baseront pour ce faire sur l'excellente implémentation AMQP du produit open-source RabbitMQ.

Transcript of AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ

AMQPInteropérabilité et découplage de systèmes hétérogènes

avec RabbitMQ

@ZenikaITPierre QueinnecBernard Jourdain

SI actuels- Grande hétérogénéité

- ERP, CRM, DB, LDAP, etc, etc

- différentes plateformes

- différents langages

- Couplages souvent forts

- appels bloquants

- formats spécifiques

Découplage

- Solution classique au couplage : MOM

- Message-Oriented Middleware

- Asynchronisme

- “Donnée en mouvement”

- Grands Acteurs

- IBM, TIBCO, Microsoft

Implémentations

- Microsoft MSMQ

- En Java/JEE, API standardisée JMS

- uniquement une API

- ne définit pas le format du message

Topologies

- P2P (peer-to-peer)

- ESB (Entreprise Service Bus)

- Pipeline

- etc...

Scalabilité

- Difficultés des topologies “Cloud”

- Machines provisionnées dynamiquement

- Nécessité d’une interopérabilité entre middlewares

AMQP

- Advanced Message Queuing Protocol

- But de réduire le “vendor lock-in”

AMQP... un format

- AMQP est un format de message

- “wire-level”

- Pas de langage/plateforme donnés, pas d’API

- À la TCP

- interopérable

Protocoles

- Pérennité protocolaire

- IP, UDP, TCP

- HTTP, SMTP

Positionnement

SMTP ?

HTTP IIOP

async

sync

unreliable reliable

Propriétés

- Fidelity - durabilité

- Security - authentification, transport

- Transactions - fiabilité

- Smart routing - intermédiation

- Management

AMQP... un standard

- Normalisé par l’OASIS

- Version 1.0 en draft quasi-final

- Technical Committee (TC) AMQP

- Finance

- Editeurs

- Peu de Services

Composition TC

- JPMorgan, Goldman Sachs, Crédit Suisse, Deutsche Börse, Bank of America...

- Microsoft, VMware, RedHat, Cisco, Kaazing...

- HCL, Zenika

AMQP... un standard

- Au-delà du format de message...

- “Broker Semantics”

- Normalisation de l’interconnexion de brokers hétérogènes

RabbitMQ

- Implémentation de

- AMQP 0-8-0

- AMQP 0-9

- AMQP 0-9-1

- AMQP 1.0

- Open-Source (MPL)

RabbitMQ

- Ecrit en Erlang

- Bibliothèques pour tous les langages - plateformes

- .Net - Java

- Erlang, JavaScript, PHP, Ruby, Python...

Routage AMQP

Client

Client

Client

Client

Client

E

E

Exchanges Queues

m m

m

m m

m

m

pub

pub

pub

sub

sub

sub

Workflow & Concepts

- Un Producteur poste un couple {Clef de Routage, Message} vers un Exchange

- Un Broker route un message vers une Queue en se basant sur sa Clef de Routage

- Un Consommateur récupère un Message depuis une Queue

- Un Message dans une Queue ne peut être récupéré que par un Consommateur

Exchanges

- Routage sur :

- la clef de routage

- les headers

- les propriétés

- le contenu

Intro aux Exchanges

- Quatre types d’Exchanges par défaut

- Direct

- Fanout

- Topic

- Headers

Fanout

- Aucun test sur la clef de routage

- Le message est routé sur toutes les Queues bindées à l’Exchange

Direct

- Clef de routage obligatoire

- Chaque Queue bindée à l’Exchange fournit une valeur de clef de routage

- Pour chaque Queue, test d’égalité entre la clef de routage du message et la valeur fournie

- Si égalité, copie du message dans la Queue

- Exemple : clef = ‘nasdaq’

Headers

- Comme pour le type Direct, mais test d’égalité sur une valeur d’entêtes (“header”) plutôt que sur la clef de routage

- Exemple (clef = valeur)

- lang = javascript

Topic- Comme pour le type Direct mais

comparaison avec possibilité d’utiliser des wildcards

- ‘*’ pour exactement un mot

- ‘#’ pour zéro ou plus de mots

- Exemples

- comp.lang.#

- *.erlang

Queues

- L’Exchange route les messages vers les Queues concernées

- Si multiple Queues, le message est traité comme dupliqué

- La Queue stocke le message jusqu’à ce qu’il soit récupéré par un consommateur

- Mécanisme de sécurité sur la récupération des messages (ack)

Cas Démo

- Elections Présidentielles 2007

- Second tour

- Visualisation des résultats du vote

Côté .Net

- MVVM Light (disponible avec Nuget)

- RabbitMQ (disponible avec Nuget)

Côté .Net- Application TechDays.Backend

- Lit le fichier Index.xml qui donne l’état d’un département

- Etat ‘CLOS’ : le résultat est là

- Etat ‘NON CLOS’ : pas de résultat pour l’instant

- Lorsque CLOS

- lit le résultat

- envoie un message à RabbitMQ

Exemple ‘NON CLOS’<Dpt>    <CodReg>82</CodReg>    <CodReg3Car>082</CodReg3Car>    <CodDpt>01</CodDpt>    <CodDpt3Car>001</CodDpt3Car>    <CodMinDpt>01</CodMinDpt>    <LibDpt>AIN</LibDpt>    <DateClotureDpt>19-­‐07-­‐2011</DateClotureDpt>    <HeureClotureDpt>14:59:04</HeureClotureDpt>    <Clos>NON  CLOS</Clos></Dpt>

Exemple de résultat<Dpt>    <CodReg>82</CodReg>    <CodReg3Car>082</CodReg3Car>    <CodDpt>01</CodDpt>    <CodDpt3Car>001</CodDpt3Car>    <CodMinDpt>01</CodMinDpt>    <LibDpt>AIN</LibDpt>    <DateClotureDpt>19-­‐07-­‐2011</DateClotureDpt>    <HeureClotureDpt>14:59:04</HeureClotureDpt>    <Clos>CLOS</Clos>    <Candidat>        <Nom>SARKOZY</Nom>        <Prenom>Nicolas</Prenom>        <Civilite>M.</Civilite>        <Voix>185  165</Voix>        <RapVoixExp>60,54</RapVoixExp>        <NumDepCand>12</NumDepCand>        <NumPanneauCand>1</NumPanneauCand>    </Candidat></Dpt>

Côté .Net

- Application TechDays.UI

- Consommateur de messages

- Affiche les résultats reçus sur une carte

- Librairie TechDays.Messaging.RabbitMQ

- Bibliothèque de production/consommation de messages

Côté Java

- Application générant des résultats en boucle

- Utilisation du driver Java RabbitMQ 2.7.1

Architecture

RabbitMQ

TechDays.Backend

TechDays.UI

TechDays.UI

TechDays.UI

Producteur Java

Démo!

Sources

- Seront disponibles rapidement sur GitHub

- https://github.com/zenika

Fier d’être Développeur

Votez

- Et merci à tous pour votre attention!

Questions?

Pics Credits- ‘Past’ by inf3ktion (CC BY-NC-SA 2.0)

- http://www.flickr.com/photos/inf3ktion/4116507516

- ‘Server Room Powerstrips’ by camknows (CC BY-NC-SA 2.0)

- http://www.flickr.com/photos/camknows/3726757043/

- ‘All The Same’ by inf3ktion (CC BY-NC-SA 2.0)

- http://www.flickr.com/photos/inf3ktion/3365226030

- ‘Survivor’ by inf3ktion (CC BY-NC-SA 2.0)

- http://www.flickr.com/photos/inf3ktion/3876697091

- ‘Server room with grass!’ by Tom Raftery, courtesy of 1E (CC BY-SA 2.0)

- http://www.flickr.com/photos/traftery/4773457853