samedi 1 mars 2025

RabbitMQ


🐰 RabbitMQ, c’est quoi ?

RabbitMQ est un message broker (ou middleware de messagerie) qui permet à des applications de communiquer entre elles de façon asynchrone, en s’échangeant des messages via des files d’attente (queues).


🧠 En résumé :

RabbitMQ est comme un facteur :

  • Une application A envoie un message (comme une lettre)

  • RabbitMQ stocke ce message dans une file d’attente

  • Une application B vient lire et traiter ce message plus tard


🧩 À quoi ça sert ?

  • Désynchroniser les traitements (éviter que tout soit bloqué en temps réel)

  • Améliorer la scalabilité d’une application (traiter plus de tâches en parallèle)

  • Fiabiliser les échanges entre composants logiciels


🛠️ Exemple concret avec C#/.NET :

Tu as un site e-commerce :

  1. Quand un utilisateur passe commande, tu ne veux pas bloquer l’interface pendant l’envoi de l’email de confirmation.

  2. Tu envoies un message à RabbitMQ : "Envoyer l’email de confirmation"

  3. Un service en arrière-plan lit les messages dans RabbitMQ et envoie les emails un par un


⚙️ Technologies souvent utilisées avec RabbitMQ :

  • C# / .NET avec la bibliothèque RabbitMQ.Client

  • Peut aussi être utilisé avec Java, Python, Node.js, etc.

  • Utilise souvent des formats de message comme JSON ou XML


🧪 Modèle de communication :

RabbitMQ fonctionne avec les concepts suivants :

  • Producer : celui qui envoie un message

  • Queue : la file d’attente où les messages sont stockés

  • Consumer : celui qui lit les messages

  • Exchange : le "routeur" qui décide dans quelle file envoyer le message





🧠 1. Concepts clés de RabbitMQ (architecture)

RabbitMQ suit le modèle "Publisher/Consumer" :

🧱 Les composants de base :

Élément Rôle
Producer Envoie un message
Exchange Reçoit le message du producer et le dirige vers une ou plusieurs queues
Queue Stocke les messages
Consumer Reçoit les messages depuis une queue et les traite

🔁 2. Types d’Exchanges (routeurs)

Un Exchange dirige les messages vers les files d’attente. Il en existe plusieurs types :

Type Description
direct Envoie à une queue avec un nom précis
fanout Envoie à toutes les queues liées
topic Envoie à des queues selon des modèles (wildcards)
headers Route par en-têtes de message, moins utilisé

🧪 3. Exemple pratique en C# (.NET 6/7)

🧰 Prérequis :

  • RabbitMQ installé localement ou via Docker

  • NuGet package : RabbitMQ.Client


✅ Étape 1 : Producer (envoi du message)

using RabbitMQ.Client;
using System.Text;

var factory = new ConnectionFactory() { HostName = "localhost" };

using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null);

string message = "Hello RabbitMQ!";
var body = Encoding.UTF8.GetBytes(message);

channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);

Console.WriteLine($"[x] Sent: {message}");

✅ Étape 2 : Consumer (réception du message)

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

var factory = new ConnectionFactory() { HostName = "localhost" };

using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null);

var consumer = new EventingBasicConsumer(channel);

consumer.Received += (model, ea) =>
{
    var body = ea.Body.ToArray();
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine($"[x] Received: {message}");
};

channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer);

Console.WriteLine("Press [enter] to exit.");
Console.ReadLine();

🐳 Tu veux utiliser Docker ?

Voici une commande Docker pour lancer RabbitMQ avec interface Web :

docker run -d --hostname my-rabbit --name rabbitmq \
  -p 5672:5672 -p 15672:15672 \
  rabbitmq:3-management

🧵 Scénarios d'utilisation typiques

  • Traitement d’e-mails en arrière-plan

  • Envoi de notifications push

  • Pipeline de traitement d’image

  • Traitement de logs / analytics





🔍 Aspects possibles à approfondir dans RabbitMQ :

  1. Les types d’Exchange (direct, fanout, topic, headers)

  2. La gestion des accusés de réception (ack) et de la fiabilité

  3. La persistance des messages / queues (durable, persistent)

  4. La gestion des erreurs (retry, dead-letter exchange)

  5. L’utilisation avec plusieurs consumers (load balancing)

  6. L'utilisation d’un topic exchange avec routing par wildcard

  7. Performance et bonnes pratiques

  8. Comment faire un traitement en file d’attente avec retry / délai

  9. Sécurité (authentification, SSL, etc.)

  10. Monitoring et métriques via l’interface Web ou Prometheus



Aucun commentaire:

Enregistrer un commentaire

RabbitMQ Lượt xem: