Introduction à RabbitMQ

1. Vue d'ensemble

Le découplage des composants logiciels est l'une des parties les plus importantes de la conception logicielle. Une façon d'y parvenir consiste à utiliser des systèmes de messagerie, qui fournissent un moyen asynchrone de communication entre les composants (services). Dans cet article, nous allons couvrir l'un de ces systèmes: RabbitMQ.

RabbitMQ est un courtier de messages qui implémente le protocole AMQP (Advanced Message Queuing Protocol). Il fournit des bibliothèques clientes pour les principaux langages de programmation.

Outre l'utilisation pour le découplage des composants logiciels, RabbitMQ peut être utilisé pour:

  • Effectuer des opérations en arrière-plan
  • Exécution d'une opération asynchrone

2. Modèle de messagerie

Tout d'abord, examinons rapidement le fonctionnement de la messagerie.

En termes simples, il existe deux types d'applications interagissant avec un système de messagerie: les producteurs et les consommateurs. Les producteurs sont ceux qui envoient (publie) des messages à un courtier et les consommateurs, qui reçoivent des messages du courtier. Habituellement, ces programmes (composants logiciels) fonctionnent sur différentes machines et RabbitMQ agit comme un middleware de communication entre eux.

Dans cet article, nous allons discuter d'un exemple simple avec deux services qui communiqueront à l'aide de RabbitMQ. L'un des services publiera des messages sur RabbitMQ et l'autre consommera.

3. Configuration

Pour le début, exécutons RabbitMQ en utilisant le guide d'installation officiel ici.

Nous utiliserons naturellement le client Java pour interagir avec le serveur RabbitMQ; la dépendance Maven pour ce client est:

 com.rabbitmq amqp-client 4.0.0 

Après avoir exécuté le courtier RabbitMQ à l'aide du guide officiel, nous devons nous y connecter à l'aide du client java:

ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); 

Nous utilisons la ConnectionFactory pour configurer la connexion avec le serveur, elle s'occupe également du protocole (AMQP) et de l'authentification. Ici, nous nous connectons au serveur sur localhost , nous pouvons modifier le nom d'hôte en utilisant la fonction setHost .

Nous pouvons utiliser setPort pour définir le port si le port par défaut n'est pas utilisé par le serveur RabbitMQ; le port par défaut pour RabbitMQ est 15672 :

factory.setPort(15678);

Nous pouvons définir le nom d'utilisateur et le mot de passe:

factory.setUsername("user1"); factory.setPassword("MyPassword");

De plus, nous utiliserons cette connexion pour publier et consommer des messages.

4. Producteur

Prenons un scénario simple dans lequel une application Web permet aux utilisateurs d'ajouter de nouveaux produits à un site Web. Chaque fois qu'un nouveau produit est ajouté, nous devons envoyer un e-mail aux clients.

Tout d'abord, définissons une file d'attente:

channel.queueDeclare("products_queue", false, false, false, null);

Chaque fois que les utilisateurs ajoutent un nouveau produit, nous publierons un message dans une file d'attente:

String message = "product details"; channel.basicPublish("", "products_queue", null, message.getBytes());

Enfin, nous fermons le canal et la connexion:

channel.close(); connection.close();

Ce message sera consommé par un autre service, qui se charge d'envoyer des e-mails aux clients.

5. Consommateur

Voyons ce que nous pouvons mettre en œuvre du côté consommateur; nous allons déclarer la même file d'attente:

channel.queueDeclare("products_queue", false, false, false, null);

Voici comment nous définissons le consommateur qui traitera les messages de la file d'attente de manière asynchrone:

DefaultConsumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery( String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); // process the message } }; channel.basicConsume("products_queue", true, consumer);

6. Conclusion

Cet article simple a couvert les concepts de base de RabbitMQ et a présenté un exemple simple d'utilisation.

L'implémentation complète de ce didacticiel se trouve dans le projet GitHub.