Introduction à RabbitMQ

RabbitMQ est un service de messagerie qui implémente le protocole AMQP (Advanced Message Queuing Protocol) et fait partie des middleware de messages les plus utilisés aujourd'hui.

Qu'est-ce que AMQP ? AMQP est un protocole applicatif standardisé conçu pour fournir des services de messagerie uniformes. Ce protocole définit une série de fonctionnalités de routage des messages, y compris les échangeurs et les files d'attente, permettant aux producteurs d'envoyer des messages vers les échangeurs, qui ensuite les distribuent aux files d'attente en attendant leur consommation par les clients. RabbitMQ respecte ce protocole, bien qu'il supporte également d'autres protocoles comme STOMP ou MQTT.

Dans les architectures modernes, MQ (Message Queue) est souvent utilisé comme service de communication inter-systèmes.

Qu'est-ce qu'une file d'attente de messages (MQ) ? Une file d'attente de messages (MQ) est une structure qui étend les principes de base des files d'attente classiques, permettant de stocker différents types de données, tels que des chaînes de texte ou des objets complexes au format JSON.

Les principales utilisations des files d'attente de messages incluent :

  • Dé-couplage asynchrone : Permettre à certaines opérations longues de s'exécuter en arrière-plan sans bloquer la réponse utilisateur.
  • Réduction des pics de trafic : Gérer les charges élevées sans saturer les systèmes en différant le traitement des requêtes.
  • Communication asynchrone : Différer le traitement de certains messages jusqu'à ce qu'ils soient nécessaires.
  • Diffusion de messages : Distribuer des informations vers plusieurs systèmes simultanément.
  • Notifications différées : Planifier des actions futures comme l'annulation automatique d'une commande non payée.

Comparaison entre différents systèmes MQ Plusieurs solutions MQ existent telles que Kafka, RocketMQ, ActiveMQ et RabbitMQ. Chacune a ses forces particulières :

  • Kafka : Idéal pour le traitement de logs avec un débit élevé.
  • RabbitMQ : Polyvalent et convivial, adapté aux entreprises de taille moyenne.
  • RocketMQ : Robuste pour les environnements financiers avec un besoin de fiabilité élevé.

Concetps clés dans RabbitMQ

  • Producteur : Émetteur de messages.
  • Consommateur : Récepteur de messages.
  • Broker : Serveur RabbitMQ gérant les flux de messages.
  • Hôte virtuel : Isolation logique entre utilisateurs.
  • Échangeur : Routeur dirigeant les messages vers les bonnes files d'attente.
  • File d'attente : Stockage temporaire des messages.

Exemple pratique Voici un exemple simple montrant comment envoyer et recevoir des messages avec RabbitMQ.

Dépendances

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.20.0</version>
</dependency>

Code du producteur

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Producteur {
    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("43.138.108.125");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        factory.setVirtualHost("mq-sdk-test");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            channel.queueDeclare("exemple", true, false, false, null);

            String message = "Bonjour RabbitMQ";
            channel.basicPublish("", "exemple", null, message.getBytes());
            System.out.println("Message envoyé : " + message);
        }
    }
}

Code du consommateur

import com.rabbitmq.client.*;

public class Consommateur {
    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("43.138.108.125");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        factory.setVirtualHost("mq-sdk-test");

        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {

            channel.queueDeclare("exemple", true, false, false, null);

            DeliverCallback callback = (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println("Reçu : " + message);
            };

            channel.basicConsume("exemple", true, callback, consumerTag -> {});
        }
    }
}

Étiquettes: rabbitmq AMQP messaging

Publié le 9 septembre à 20h27