Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Java Spring
  3. Les intergiciels à messages (MOM)
Extrait - Java Spring Le socle technique des applications Jakarta EE (4e édition)
Extraits du livre
Java Spring Le socle technique des applications Jakarta EE (4e édition) Revenir à la page d'achat du livre

Les intergiciels à messages (MOM)

Introduction

Les intergiciels à messages, en anglais Message-Oriented Middleware ou son abréviation MOM, sont des logiciels qui s’échangent de l’information avec des messages via un réseau informatique. Cela permet d’avoir un couplage faible et d’être asynchrone via un stockage des messages en attente de traitement. Les messages sont composés d’une partie technique utilisée par la partie middleware et d’une partie données dont le format est à la discrétion des applications utilisant ces messages.

On parle aussi de Brokers et de serveurs de messages.

Deux grandes familles existent :

  • Les messages peuvent être routés, enrichis, appauvris, couplés, transformés par le middleware, comme pour les services web, on parle alors souvent d’intégration d’application d’entreprise, abrégé EAI (Enterprise Application Integration en anglais). Dans ce cas, le middleware est utilisé pour permettre l’échange d’informations entre des applications hétérogènes à tendances monolithiques.

  • Les messages sont juste transportés (et stockés temporairement) sans modifications. On parle alors de messages pauvres.

Comme pour les services web, qui sont généralement synchrones, la tendance est d’utiliser des messages pauvres...

Implémentations open source

Protocole

Nom du fournisseur

ActiveMQ

Apache Software Foundation

HornetMQ

JBoss

JBoss Messaging

JBoss

Kafka

Apache Software Foundation

RabbitMQ

AMQP

ZeroMQ

Imatix

Ces implémentations sont gratuites, mais le support et les adaptations sont à faire en interne et si on rencontre un problème il faut le gérer. Elles sont simples côté développement, mais peuvent devenir très vite un enfer lors de la mise en production et lors de la montée en charge. C’est pourquoi des entreprises proposent d’aider en améliorant les implémentations et en proposant du support au niveau de l’utilisation par les développeurs et pour la mise en place de la production. Il est même possible de personnaliser l’implémentation pour l’adapter aux besoins du client, par l’optimisation de certains aspects en fonction de l’utilisation. L’intervention, même courte, d’un expert du produit, bien que souvent perçue comme chère, fait généralement gagner un temps considérable et permet d’anticiper les problèmes.

Un expert expliquera par exemple le mécanisme des retry qui demandent à avoir des systèmes idempotents en cas de timeout, entrainant un retry avec tous les enjeux qui tournent autour. Il ne suffit pas de regarder des vidéos de karaté pour avoir...

Implémentations propriétaires

Protocole

Nom du fournisseur

IBM WebSphere MQ

IBM

MSMQ

Tibco Software

TIBCO Rendezvous

JBoss

Synchrony Messaging

Axway

Ces implémentations sont souvent couplées avec d’autres outils dans un ensemble cohérent. Elles sont souvent onéreuses, mais il y a du support et des garanties. Elles apportent aussi des solutions "sur étagères" et sont parfois bien adaptées dans certains contextes.

Les cas d’utilisation

Il existe aujourd’hui une multitude de protocoles et d’API comme JMS, Stomp, MQTT, AMQP, XMPP… et des outils qui se basent sur les messages comme Flume, Logstash, Syslog…

Dans ce chapitre, nous verrons quelques exemples d’utilisation avec Spring pour ActiveMQ (JMS), Redis et RabbitMQ pour l’utilisation pure MOM en abordant le contexte d’utilisation.

ActiveMQ est la réponse par défaut pour faire du MOM. Les outils Kafka, RabbitMG ont des patterns d’architectures différents pour répondre aux problèmes d’envoi et de réception de messages.

Pour le développement, nous devons choisir l’implémentation en fonction du contexte d’utilisation. Parfois, nous ne connaissons pas encore toutes les contraintes futures et nous ne savons pas comment l’application va évoluer. Il faut donc séparer dans le code l’implémentation de la fourniture et la consommation des messages du code métier de façon à pouvoir changer relativement facilement de MOM. Il s’agit de l’approche d’Architecture hexagonale. Pour la partie technique du code, nous nous adaptons au mieux au MOM utilisé et Spring offre énormément d’aide sur ce point avec ses couches d’abstraction. 

En effet, nous migrerons l’application pour prendre en compte les préoccupations...

JMS et ActiveMQ

JMS (Java Messaging Service) est une interface de programmation qui permet d’échanger des messages de façon asynchrone (et plus rarement synchrone en mode point à point) entre applications Java.

Tous les serveurs Jakarta EE fournissent un service JMS lié avec le JCA (Java Connector Architecture).

JMS s’appuie sur un intergiciel (middleware) pour l’implémentation.

Il y a historiquement plusieurs versions de JMS :

Versions

Dates

Compléments

1.0.2b

juin 2001

 

1.1

mars 2002

 

2.0

mars 2013

JSR 343

2.1

Septembre 2017

JSR 368 retirée

JSR 343 : JMS (Java Message Service) 2.0

JSR 368 : JavaTM Message Service 2.1

JMS n’est plus prioritaire pour Java EE 8.

Il faut un fournisseur de service pour JMS.

Voici une liste de fournisseurs open source :

Fournisseur

Fournisseur

ActiveMQ

Apache

OpenJMS

Collectif 

JBoss Messaging

JBoss

HornetQ

JBoss

JORAM/OW2

ObjectWeb

Open Message Queue

Sun Microsystem

Il y a aussi des implémentations propriétaires comme BEA Weblogic et Oracle AQ d’Oracle, WebSphere MQ d’IBM et SAP NetWeaver de SAP qui ont leur utilité dans des contextes d’utilisation adaptés.

Pour les exemples illustrant JMS, nous utiliserons ActiveMQ d’Apache (http://activemq.apache.org/) qui supporte JMS depuis la version 1.1 et J2EE 1.4.

La version 5.17.0 d’Active MQ a été livrée en mars 2021. Cette version supporte aussi AMQP v1.0 et MQTT v3.1. Elle fonctionne avec Spring 5.x, Log4j 2.x, JDK 11+. Active MQ peut être monté en mémoire pour les tests JUnit. Son exploitation avec Spring est très simple...

RabbitMQ

RabbitMQ est basé sur AMQP et a été créé par Pivotal. Il est sous licence Mozilla Public License. Il prend le relais d’ActiveMQ.

1. Spring AMQP et RabbitMQ

Dans le monde des échanges de messages asynchrones, on découple la partie producteur et consommateur. Un producteur produit un message sur une zone logique appelée un "Exchange". Nous publions un message via le "routing key". La queue est déterminée par cette "routing key", mais le producteur ne sait pas quelle queue sera utilisée pour véhiculer son message.

Le consommateur déclare une queue, il s’inscrit par rapport à un exchange et définit une "binding key" qui indique la règle de routage qui permet de transférer le message jusqu’à lui.

Cela lui permet de filtrer les messages qu’il souhaite recevoir dans la zone "Exchange". 

On type les exchanges de deux façons :

  • Fanout : on envoie les messages en broadcast sans règles de routing.

  • Direct : correspondance entre la “routing key” et la “binding key”.

  • Topic : pour une “routing key”, possibilité d’utiliser des jokers (wildcards) dans les “binding key”.

On peut modéliser ainsi :

Élément

Pattern

Remarques

Exchange

Business domain

 

Queue

service

Consomme les messages

Routing key

Type d’événement envoyé

 

Binding key

Agrégateur d’événements pour un service

 

Par exemple, dans une application microservice, on sépare...

Points clés

  • Les MOM sont très pratiques pour faire communiquer des microservices ou des applications monolithiques.

  • Il n’y a pas beaucoup de différences au niveau du code entre les différentes solutions de MOM.

  • Il faut garder à l’esprit que l’architecture peut évoluer.

  • Les MOM permettent de retirer de la tension dans certains goulots d’étranglement en lissant la charge sur les appels.