💻 Développement

rabbitmq-patterns-guide

Patterns de messaging avec RabbitMQ — exchanges, queues, routing, dead letter, pub/sub et intégration avec MassTransit/.NET.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- rabbitmq-patterns-guide --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } rabbitmq-patterns-guide -Launch"

🚀 Déjà installé ?

claude "/rabbitmq-patterns-guide"

Ou tapez /rabbitmq-patterns-guide dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

RabbitMQexchangequeuedead letterpub/sub RabbitMQMassTransitmessage broker

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/dev-skills/rabbitmq-patterns-guide ~/.claude/skills/

Source : dev-skills/rabbitmq-patterns-guide

📖 Manuel

Guide des Patterns RabbitMQ

Workflow

  1. Identifier le pattern : point-à-point, pub/sub, routing, topics ou RPC.
  2. Concevoir la topologie : exchanges, queues, bindings et routing keys.
  3. Implémenter : producteur, consommateur et gestion des erreurs.
  4. Fiabiliser : dead letter, retry, idempotence et monitoring.

Types d'exchanges

ExchangeRoutingUsage
DirectRouting key exacteCommandes ciblées, work queues
FanoutBroadcast à toutes les queuesNotifications, événements globaux
TopicPattern matching (*.order.#)Routing flexible par catégorie
HeadersAttributs des headersRouting complexe multi-critères

Patterns fondamentaux

Work Queue (répartition de charge)

Producer → [Queue] → Consumer 1
                   → Consumer 2
                   → Consumer 3

Pub/Sub (diffusion d'événements)

Producer → [Fanout Exchange] → Queue A → Consumer A
                             → Queue B → Consumer B
                             → Queue C → Consumer C

Topic Routing

Producer → [Topic Exchange] → order.created.* → Queue Orders
                            → payment.*.failed → Queue Alerts
                            → #.audit → Queue Audit

Implémentation avec MassTransit (.NET)

Configuration

builder.Services.AddMassTransit(x =>
{
    x.AddConsumer<OrderCreatedConsumer>();
    x.AddConsumer<PaymentFailedConsumer>();

    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("rabbitmq://localhost", h =>
        {
            h.Username("guest");
            h.Password("guest");
        });

        cfg.ReceiveEndpoint("order-service", e =>
        {
            e.PrefetchCount = 16;
            e.UseMessageRetry(r => r.Intervals(
                TimeSpan.FromSeconds(1),
                TimeSpan.FromSeconds(5),
                TimeSpan.FromSeconds(30)));

            e.ConfigureConsumer<OrderCreatedConsumer>(context);
        });

        cfg.ConfigureEndpoints(context);
    });
});

Consumer

public class OrderCreatedConsumer : IConsumer<OrderCreated>
{
    private readonly IOrderRepository _repo;

    public OrderCreatedConsumer(IOrderRepository repo) => _repo = repo;

    public async Task Consume(ConsumeContext<OrderCreated> context)
    {
        var message = context.Message;

        // Idempotence : vérifier si déjà traité
        if (await _repo.ExistsAsync(message.OrderId))
            return;

        await _repo.ProcessOrder(message);

        // Publier un événement de suite
        await context.Publish(new OrderProcessed
        {
            OrderId = message.OrderId,
            ProcessedAt = DateTime.UtcNow
        });
    }
}

Messages

// Événement (passé, notification)
public record OrderCreated
{
    public Guid OrderId { get; init; }
    public string CustomerId { get; init; }
    public decimal Amount { get; init; }
    public DateTime CreatedAt { get; init; }
}

// Commande (impératif, action)
public record ProcessPayment
{
    public Guid PaymentId { get; init; }
    public Guid OrderId { get; init; }
    public decimal Amount { get; init; }
}

Dead Letter & Retry

Stratégie de retry progressive

Message → Queue principale → Consumer
              ↓ (échec)
         Queue retry (delay 5s) → retry
              ↓ (échec x3)
         Queue retry (delay 30s) → retry
              ↓ (échec x3)
         Dead Letter Queue → alerte + investigation manuelle

Configuration Dead Letter

cfg.ReceiveEndpoint("order-processing", e =>
{
    // Retry immédiat (erreurs transitoires)
    e.UseMessageRetry(r => r.Intervals(
        TimeSpan.FromSeconds(1),
        TimeSpan.FromSeconds(5),
        TimeSpan.FromSeconds(30)));

    // Redelivery (erreurs plus longues)
    e.UseDelayedRedelivery(r => r.Intervals(
        TimeSpan.FromMinutes(1),
        TimeSpan.FromMinutes(5),
        TimeSpan.FromMinutes(30)));

    // Après tous les retries → dead letter
    e.ConfigureConsumer<OrderConsumer>(context);
});

Monitoring

MétriqueSeuil d'alerteAction
Queue depth> 10 000 messagesAjouter des consumers
Consumer lag> 5 minutesVérifier la performance
Dead letter count> 0Investiguer les échecs
Connection drops> 1/heureVérifier le réseau
Memory usage> 80%Purger ou ajouter des nœuds

Règles