Enterprise Integration Patterns pour OSB

En parallèle de Laurent qui réalise un plugin Eclipse sur les EIP (Enterprise Integration Patterns), je vous présente leurs implémentations pour le produit Oracle Services Bus 12c. Pour une meilleure compréhension, je reprends le formalisme du site référence EnterpriseIntegrationPatterns.com. Les catégories restent donc inchangées :

  • Integration style
  • Messaging systems
  • Messaging channels
  • Message construction
  • Message routing
  • Message transformation
  • Messaging endpoints
  • Messaging management.

L’objectif de cet article n’est pas de les présenter mais de proposer une implémentation au très performant Oracle Service Bus (OSB). Pour plus de clarté, je reprend le schéma de positionnement des patterns dans une médiation (cf. eip.com):

Organisation des patterns dans une médiation

Le 1er parallèle que l’on peut faire est la similitude entre cette organisation et l’approche VETRO d’OSB. (Validate, Enrich, Transform, Route et Operate).

Organisation VETRO d’Oracle

Le 2nd point à présenter avant de rentrer dans le détails des EIP, est le fait qu’OSB véhicule et transforme du XML. Quelque soit les flux ou les protocoles manipulés, tout devient XML.

Ci-dessous, je reprends chaque pattern EIP pour en apporter une déclinaison avec OSB. Chaque tableau présente alors:

  • Le schéma synthétique du pattern
  • Son nom avec le lien vers sa description
  • Une problématique représentative
  • la vision / implémentation OSB (outillage, concept, etc.)

Débutons par les intégrations protocolaires:

Integration Styles
Schéma Pattern Objectifs Implémentation Oracle Services Bus
File Transfer Comment intégrer des applications qui s’échangent des fichiers ? Transport FileAdapter File
Shared Database Comment intégrer des applications qui s’échangent des données par des bases de données ? Adapter Database, Adapter Coherence
Remote Procedure Invocation Comment intégrer des applications qui s’échangent des messages et des commandes via un mécanisme RPC ? Transport HTTPTransport WSTransport EJB
Messaging Comment intégrer des applications qui s’échange des messages ? Transport JMS, Transport MQAdapter JMS, Adapter AQ

 

 

Les EIP abordent la notion de messages au travers de leurs définitions, leurs manipulations, leurs capacités à être orientés, transformés puis communiqués.

Messaging Systems
Schéma Pattern Objectifs Implémentation Oracle Services Bus
Message Channel Comment une application communique avec une autre ? La notion de Pipeline structure la route du message.
Message Comment 2 applications connectées par un canal de messages échangent des informations ? La notion de message est représentée en documents XML ($header, $body et $attachments)
Pipes and Filters Comment gérer la complexité des traitements des messages tout en garantissant leur indépendance et leur flexibilité ? Les notions de Proxy, de Pipeline, de Split-Join et de Business découplent les problématiques. La combinaison de (Proxy+(Pipelines)*(SplitJoin)*)* + Business* est infinie.
Message Router Comment router un message vers des consommateurs différents en fonction de critères ? Le composant Dynamic Routing permet le choix d’un destinataire sur critère XPath.
Message Translator Comment utiliser des formalismes différents pour interagir avec les différents partenaires ? Les transformations sont réalisables avec XQuery et XSLT.
Message Endpoint Comment l’application se connecte pour envoyer ou recevoir un message ? Les Endpoints sont encapsulés dans les transports et les adapters. Du paramétrage permet l’exposition ou l’émission sur les différents protocoles supportés.

 

Les EIP définissent des principes d’interconnection entre les systèmes: point à point, publication-souscription, etc. Ils offrent une vision simple d’un type d’échange de messages entre N systèmes.

Pour la gestion des messages, OSB se base principalement sur les fonctionnalités offertes par l’implémentation JMS de Weblogic. Ainsi, OSB inclut un MOM (Message Oriented Middleware) sans ajouter de complexité par de nouveaux concepts ou de nouveaux outils.

Messaging Channels
Schéma Pattern Objectifs Implémentation Oracle Services Bus
Point-to-Point Channel Comment l’appelant peut être sûr que son message ou son appel sera bien communiqué à un seul récepteur ? Il convient d’utiliser une file JMS Queue en Business.
Publish-Subscribe Channel Comment les éméteurs peuvent envoyer un message à tous les récepteurs en une fois ? Il convient d’utiliser une file JMS Topic en Business.
Datatype Channel Comment l’application peut émettre des données interprétables par le récepteur ? Ceci est porté par le corps du message JMS. XML est préféré.
Invalid Message Channel Comment le récepteur d’un message peut émettre un autre message exprimant son incapacité fonctionnelle à le traiter ? Via une file JMS dédiée
Dead Letter Channel Que faire d’un message qui ne peut être délivré ? Via une file JMS dédiée
Guaranteed Delivery Quelle est la garantie de délivrance du message, même si le système de messages échoue ? Le niveau de QoS est paramétrable. Il est garanti pour email, FTP, Fichier, JMS, Tuxedo, WebSphere MQ et WebServices.
Channel Adapter Quels sont les moyens de connexion des applications pour émettre et recevoir des messages ? Le bus propose les protocoles HTTP, JMS, LDAP, JDBC, T3, etc.
Messaging Bridge Comment se réalise la distribution et la répartition des messages entre plusieurs systèmes de gestion de messages ? De manière automatique entre les noeuds d’un même cluster Weblogic. Par un protocole ouvert (HTTP, JMS, JDBC, etc) entre OSB et d’autres éditeurs.
Message Bus Est-ce que l’architecture réduit les adhérences entre applications émettrices/réceptrices ? C’est un ESB par nature. Seuls les contrats de services sont exposés.

 

Les EIP définissent des notions fines spécifiques aux messages tels que les commandes, les documents, les événements, etc.

Message Construction
Schéma Pattern Objectifs Implémentation Oracle Services Bus
Command Message Comment invoquer une procédure d’une application ? Le message inclut les metadonnées du protocole en XML ($operation, $inbound et $outbound).
Document Message Comment transférer des données entre applications ? Tous les formats entrant sont transformés en XML. Le message est routé au format XML ($body et $header). Les conversions vers les formats natifs sont portés par les transports et les adapters.
Event Message Comment transmettre des événements entre applications ? La notion d’événement ne porte pas explicitement l’opération ou le destinataire à appeler. (Il peut y en avoir plusieurs.) La combinaison Queues JMS, Filtres JMS et Route One-Way y répond. Bien qu’OSB puisse véhiculer des événements, ceci est très limité (pas d’aggregation, pas de corrélation, etc.). Pour la gestion d’événement, Oracle Stream Explorer est un outils plus riche en fonctionnalités.
Request-Reply Sur l’émission d’un message comment obtenir une réponse du récepteur final ? Les routes PipelinePair émettent la réponse du récepteur pour les protocoles synchrones.
Return Address Comment un récepteur connait l’adresse de publication de la réponse ? Pour les protocoles synchrones, elle est inclue dans la question.Pour les asynchrones:
  • JMS avec une gestion du Reply-to
  • BPEL transport avec une gestion de WS-Addressing.
Correlation Identifier Comment un lier une demande et une réponse ? Valable uniquement pour les protocoles asynchrones:
  • JMS avec l’ID de corrélation (JMSCorrelationID).
  • WS-Addressing avec les MessageID et RelatesTo.
Message Sequence Comment transmettre une quantité importante de données ? Les lectures de fichiers sont possibles avec le File Transport et l’adapter JCA File. Différentes stratégies sont possibles: lecture, attachment, claim check, par lots, etc.
Message Expiration Comment un émetteur indique quand son message est obsolète ? Pour JMS, avec une durée de vie. Pour les protocoles synchrones, les timeouts de connexion et de réponse s’y rapprochent.
Format Indicator Comment un formalisme de message peut-il être définit afin de permettre des évolutions ? Utilisation de namespaces pour les flux XML. En JMS, un attribut d’entête définit la version du format du message.

 

Les EIP définissent des concepts de routage simples afin de concevoir clairement les médiations du middleware.

Message Routing
Schéma Pattern Objectifs Implémentation Oracle Services Bus
Content-Based Router Comment router un message en fonction de son contenu ? Si lié à l’opération Conditional Branch, sinon If then
Message Filter Comment filtrer les messages pertinents et intéressant ? Filtre JMS dans le transport ou l’adapter
Dynamic Router Comment router le message en fonction de règles non contenues dans le message ? Dynamic Routing
Recipient List Comment router les messages vers une liste de destinataires dynamiques ? Les Business définissent une liste d’entry points disponibles.Avec une clée, le DynamicRouting y répond.Sinon, la surcharge de l’URI destinatrice est possible.
Splitter Comment scinder un message en n éléments qui doivent être gérés différemment ? approche classique: For Each.Split Join si l’Aggregator est utilisé.modulaire: For each + n pipeline
Aggregator Comment combiner le résultats de n chemins en 1 seul message ? Si parallélisme fort: Split Join + PipelineSinon For each + n variables résultats
Resequencer Comment réordonner un flux de message dans l’ordre désiré ? Resequencer  à l’entrée du Pipeline.
Composed Message Processor Comment faire suivre des traitements différents à des parties d’un message qui forment un tout ? For each ou Split Join
Scatter-Gather Comment maintenir le flux lorsqu’un appel doit être réalisé à différentes applications ? Service Callout
Routing Slip Comment router un message consécutivement au travers de séries de traitements dont les étapes varient en fonction du contenu et de l’orchestration ? Si peu complexe, If then.Sinon, déléguer au moteur BPEL de la SOA Suite.
Process Manager Comment router un message au travers de flux composés de N routes dont les étapes ne sont pas connus à la conception ? Hors scope OSB, cf la SOA Suite
Message Broker Comment découpler les émetteurs et récepteurs de messages au travers d’un management centralisé ? OSB est un bus centralisé. L’OEM gère un domaine Weblogic (n serveurs, n clusters, etc).

 

Avant d’être communiqués, les messages doivent être transformés dans des formats natifs, normalisés et techniques.

Message Transformation
Schéma Pattern Objectifs Implémentation Oracle Services Bus
Introduction to Message Transformation Les transformations sont réalisées avec XPath, XQuery ou XSLT. L’appels à des fonctions Java via les Java Callout est aussi possible.
Envelope Wrapper Comment le système s’abstrait du formalisme et gère les éléments complémentaires tels que l’entête ou l’encryption ? Les notions de messages sont uniformes avec $body, $header et $attachment.
Content Enricher Comment enrichir le message avec un contenu fournit par une application externe ? Les Services Callout permettent des appels complémentaires au flux principal. L’enrichissement entre le flux et le retour est une étape supplémentaire.
Content Filter Comment réduire les données d’un message ? Il faut “couper” les branches de l’arbre XML via transformation pour réduire les données.
Claim Check Comment réduire les données véhiculées dans le système sans perdre des données ? Le message véhiculé porte les métadonnées (nom de fichier, taille, dates de réception, etc) pour être, au final, interprété par le destinataire. Il n’est donc pas lu par OSB.
Normalizer Comment transformer les messages sémantiquement équivalent mais arrivant dans des formats différents ? La normalisation / de-normalisation est plus aisée à gérer en XSLT.
Canonical Data Model Comment gérer le principe de modèles pivots ? Les schémas utilisés pour la normalisation / de-normalisation sont ceux du modèle pivot. La gestion de ces ressources par le MDS est préférable.

 

Les EIP clarifient les comportements des Endpoints, de la disponibilité, du support transactionnel, de la distribution, etc.

Messaging Endpoints
Schéma Pattern Objectifs Implémentation Oracle Services Bus
Messaging Gateway Comment encapsuler l’accès à un bus de messages ?  Un ESB répond par nature à ce pattern.
Messaging Mapper Comment transformer les messages sans rendre adhérent les applications prenant part à l’échange ?  cf. mon article sur les Demi-Flux
Transactional Client Comment un client peur contrôler la transaction vers un destinataire et/ou via le bus ? Le contrat de service WSDL doit être transactionnel pour que la transaction soit propagée (WS-AtomicTransaction).Le bus ne fait que véhiculer la transaction (XA, JTA). La gestion des transactions via les appels de services doit être portée par l’orchestrateur SOA Suite.
Polling Consumer Comment une application consume un message lorsque celle-ci est prête ? Il n’existe pas de support natif pour l’asynchrone. Il faut passer par des consommateurs files JMS.Pour le synchrone, la notion de WorkManager contraint la consommation ou l’émission, ou bien le rejeu sur erreur permet de palier une perte momentanée de service du destinataire.
Event-Driven Consumer Comment une application consomme les messages disponibles ?  Le bus véhicule des messages afin de respecter le couplage faible, mais il ne doit pas être le consommateur. Il faut les communiquer à des CEP tels que Oracle Stream Explorer.
Competing Consumers Comment envoyer en parallèle des messages à plusieurs clients ? La concurrence des routes est gérée par Split Join.
Message Dispatcher Comment gérer des envois multiples et parallèles d’un même message ?  Idem que précédemment, Split Join.
Selective Consumer Comment filtrer les messages pour les consommateurs ?  En asynchrone, les filtres JMS prennent en charge cela.En synchrone, il convient d’ajouter un Pipeline en amont des routes suivantes pour réaliser un 1er niveau de routage.
Durable Subscriber Comment ne pas perdre de messages en cas d’indisponibilité du destinataire ?  En asynchrone, il faut utiliser des files JMS persistantes.En synchrone, un Hôpital de messages est indispensable. La durée de validité fonctionnelle du message étant complexe, il est préférable de déléguer cela à de l’orchestration sur la SOA Suite.
Idempotent Receiver Comment un récepteur gère les duplications de messages ? Cela dépend des protocoles utilisés durant l’échange.
Service Activator Comment un service applicatif peut être sollicité alors qu’il ne supporte pas les protocoles standards ?  OSB propose des connecteurs Tuxedo, WebSphere MQ, etc.

 

Enfin, les EIP dessinent les moyens communs supports à la gestion des messages.

System Management
Schéma Pattern Objectifs Implémentation Oracle Services Bus
Control Bus Comment administrer la plateforme ? Une console d’administration est disponible pour gérer les projets, les ressources, les SLA, les alertes, etc.
Detour Quelles sont les fonctionnalités proposées aux développeurs de médiations (debug, trace, etc) ? Les niveaux de traces sont administrables.Le debug des routes est intégré à JDeveloper ou la console d’administration.
Wire Tap Comment visualiser un message lors d’un appel ? Le composant Log trace le contenu désiré.Le composant Report enregistre un contenu qui peut être le message.
Message History Comment analyser et débugger le flux à posteriori ? Pas d’historisation des messages pour des raisons de performance.
Message Store Comment réaliser des rapports d’usage sans perturber le système ? Le composant Report trace les informations à la demande en BD.L’analyse des traces HTTP est à réaliser, avec ELK par exemple.
Smart Proxy Comment traquer un retour de message asynchrone ? Par une implémentation d’un proxy OSB.
Test Message Comment la santé de la route peut-elle être vérifiée ? Le suivi peut être activé au niveau Service, Pipeline ou Composant.
Channel Purger Comment gérer des channels pour les tests ? Channels bouchons (cf. SoapUI)

 

Voilà, j’espère que la mise en oeuvre des Patterns d’Entreprise avec Oracle Service Bus sera plus aisée pour vous maintenant.

En synthèse, ces problématiques sont classiques lors de la mise en oeuvre d’un ESB. Si vous avez besoin d’aide pour cela ou bien pour réaliser un audit sur la conformité de vos médiations par rapport à ces patterns, n’hésitez pas à me contacter.

3 réflexions au sujet de « Enterprise Integration Patterns pour OSB »

  1. Merci pour ce très bon article !! Il fournit un guide pour trouver la bonne implémentation en OSB d’un pattern précis.
    Je trouve que c’est une très bonne idée que de partir de la norme http://www.enterpriseintegrationpatterns.com/toc.html pour représenter les patterns d’entreprise.

    Mon sentiment à la lecture de l’article est qu’OSB – même dans sa version 12 – est maladroit quant à la prise en charge des EIP. Même s’il peut s’avérer très performant au RunTime, on sent qu’il n’est pas à l’aise comme peuvent l’être des produits comme Camel qui ont été écrit expressément pour ce besoin :
    – Passage obligé par du XML, d’où la nécessité de passer par les technologies associées, XSL, XPath, XQuery pour tout besoin d’agrégation, de routage, etc…
    – Nécessité de faire appel à des procédures BPEL sous SOA en face de patterns un peu évolués
    – Passage obligé semble-t-il par des adapteurs à la norme JCA pour appeler le monde extérieur. Ces adapteurs sont nombreux sous Oracle pour accéder à des bases de données, du JMS, du Tuxedo, mais cela reste le chemin obligé.

    Cela pourrait être intéressant de fournir la même vision d’adéquation aux EIP pour d’autres produits tels que Camel, Mule, Spring Integration…

    Détail : Un lien cassé sur ton article : sur le Transport File de l’implémentation OSB (http://docs.oracle.com/middleware/1213/osb/develop/osb-transport-poller.htm#OSBDV89411)

    Laurent

    1. Le lien est corrigé.

      Pour l’approche EIP, OSB ne propose pas une démarche intellectuelle calquée sur les EIP comme l’est Camel. C’est un avantage ou un défaut en fonction de ses motivations.

      OSB est un bus d’entreprise comme RedHat Fuse ESB par exemple. Leurs périmètres sont identiques. Le produit Oracle SOA Suite apporte des techniques complémentaires pour des usages plus riches et plus complexes mais différents. La notion de médiation “un peu évolué” est ici assez subjective je trouve. Il est possible de faire très compliqué avec OSB ! 😉

      Enfin, quand à l’utilisation des adapteurs, ils sont des passages obligés avec OSB et SOA mais offrent en contre-partie un paramétrage fin pour chaque médiation.

      Merci Laurent pour ton FB.

Laisser un commentaire