Introduction à RabbitMQ

Introduction à RabbitMQ

1. Vue d'ensemble

Le découplage des composants logiciels est l’un des éléments les plus importants de la conception de logiciels. Un moyen d'y parvenir consiste à utiliser des systèmes de messagerie, qui fournissent un moyen de communication asynchrone entre 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 Advanced Message Queuing (AMQP). Il fournit des bibliothèques client pour les principaux langages de programmation.

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

  • Effectuer des opérations en arrière-plan

  • Effectuer une opération asynchrone

2. Modèle de messagerie

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

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

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 vers RabbitMQ et l'autre consommera.

3. Installer

Pour commencer, exécutons RabbitMQ en utilisant le guide de configuration officielhere.

Nous utiliserons naturellement le client Java pour interagir avec le serveur RabbitMQ; leMaven dependency 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 lesConnectionFactory pour configurer la connexion avec le serveur, il s'occupe également du protocole (AMQP) et de l'authentification. Ici, nous nous connectons au serveur surlocalhost, nous pouvons modifier le nom d'hôte en utilisant la fonctionsetHost.

Nous pouvons utilisersetPort 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 est15672:

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 la publication et la consommation de messages.

4. Producteur

Consider a simple scenario où une application Web permet aux utilisateurs d'ajouter de nouveaux produits à un site Web. Chaque fois que de nouveaux produits sont ajoutés, nous devons envoyer un courrier électronique 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 publions 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 utilisé par un autre service, responsable de l’envoi de courriers électroniques aux clients.

5. Consommateur

Voyons ce que nous pouvons mettre en œuvre du côté des consommateurs; 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:

Consumer 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 couvrait les concepts de base de RabbitMQ et discutait d'un exemple simple d'utilisation.

L'implémentation complète de ce didacticiel se trouve dansthe GitHub project.