💻 Développement

dev-message-queue-architect

Architecture de messaging avec RabbitMQ, Kafka, Azure Service Bus.

⚡ 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 -- dev-message-queue-architect --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-message-queue-architect -Launch"

🚀 Déjà installé ?

claude "/dev-message-queue-architect"

Ou tapez /dev-message-queue-architect 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 :

message queueRabbitMQKafkaqueuemessagingasyncpub/subbrokerconsumerproducer

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-message-queue-architect ~/.claude/skills/

Payload du plugin : skills/dev-message-queue-architect · source éditable : dev-skills/message-queue-architect

đź“– Manuel

Message Queue Architect

Workflow

1. Qualifier le besoin

Avant de choisir un broker, répondre à ces questions :

QuestionImpact
Un seul consumer ou plusieurs ?Point-to-point vs Pub/Sub
Rejouer les messages après coup ?Kafka / event log ; RabbitMQ non
Volume cible (msg/s) ?< 10k → RabbitMQ/ASB ; > 100k → Kafka
Latence acceptable ?< 5 ms → NATS/Kafka ; > 100 ms → ASB OK
Cloud imposé ?Azure → ASB ; AWS → SQS/SNS/MSK ; GCP → Pub/Sub
Ordre garanti requis ?Kafka (par partition) ; ASB sessions ; RabbitMQ non natif
Durabilité longue (audit, analytics) ?Kafka (retention configurable)

2. Choisir le broker

RabbitMQ   → routing complexe, RPC async, on-prem, cas général < 50k msg/s
Kafka      → event streaming, replay, analytics, > 50k msg/s, multi-consumer
Azure ASB  → cloud Azure, sessions, dead letter auto, filtres SQL sur topics
NATS       → latence < 1 ms, IoT, microservices légers
SQS/SNS    → cloud AWS, simplicité opérationnelle, FIFO optionnel

3. Concevoir les topics/exchanges et queues

Naming convention (préfixer par domaine.action.version) :

orders.created.v1
payments.processed.v2
notifications.email.requested.v1

RabbitMQ — exchange topic + binding :

# Déclarer l'exchange et la queue, créer le binding
rabbitmqadmin declare exchange name=orders type=topic durable=true
rabbitmqadmin declare queue name=orders.processing durable=true
rabbitmqadmin declare binding source=orders \
  destination=orders.processing routing_key="orders.created.*"

Kafka — créer un topic avec partitions :

kafka-topics.sh --bootstrap-server localhost:9092 \
  --create --topic orders.created.v1 \
  --partitions 12 --replication-factor 3 \
  --config retention.ms=604800000   # 7 jours

Règle partitions : nb_partitions >= nb_consumers_max ; clé de partition = identifiant métier (orderId) pour garantir l'ordre par entité.

4. Définir l'enveloppe de message

{
  "messageId": "uuid-v4",
  "correlationId": "uuid-parent",
  "timestamp": "2026-06-24T10:00:00Z",
  "type": "OrderCreated",
  "version": "1",
  "source": "order-service",
  "payload": { ... }
}

5. Choisir la garantie de livraison

NiveauMécanismeQuand
At-most-oncefire & forget, no ackmétriques, logs non critiques
At-least-onceack après traitement, idempotence consumercas général (défaut recommandé)
Exactly-onceOutbox Pattern + transaction DBpaiements, comptabilité

Outbox Pattern (C# / EF Core) :

// Dans la même transaction DB que la mutation métier
await _db.OutboxMessages.AddAsync(new OutboxMessage {
    Id = Guid.NewGuid(),
    Type = "OrderCreated",
    Payload = JsonSerializer.Serialize(orderCreatedEvent),
    CreatedAt = DateTime.UtcNow
});
await _db.SaveChangesAsync(); // atomique avec la commande métier

// Worker séparé publie l'Outbox et marque ProcessedAt

Idempotence consumer (exemple) :

if (await _cache.ExistsAsync($"msg:{message.MessageId}")) return; // déjà traité
await ProcessAsync(message);
await _cache.SetAsync($"msg:{message.MessageId}", 1, TimeSpan.FromHours(24));

6. Configurer les erreurs et la DLQ

RabbitMQ — dead letter exchange :

rabbitmqadmin declare queue name=orders.processing \
  arguments='{"x-dead-letter-exchange":"orders.dlx","x-message-ttl":30000,"x-max-retries":3}'

Stratégie de retry : backoff exponentiel avec jitter

Tentative 1 : 1 s
Tentative 2 : 5 s
Tentative 3 : 30 s
Tentative 4 : 5 min → DLQ

Azure Service Bus — activer dead lettering :

var options = new ServiceBusProcessorOptions {
    MaxConcurrentCalls = 4,
    AutoCompleteMessages = false,
    MaxAutoLockRenewalDuration = TimeSpan.FromMinutes(5)
};
// Après N échecs, ASB déplace automatiquement en DLQ ($DeadLetterQueue)

7. Sérialisation

JSON     → lisibilité, débogage facile, interop universel ; payload +30-40 % vs binaire
Protobuf → typage fort, compact, idéal si volume > 10k msg/s ou bandwidth limité
Avro     → Kafka + Confluent Schema Registry, compatibilité schéma garantie

Toujours inclure "version" dans l'enveloppe ; ne jamais renommer un champ obligatoire (breaking change).

8. Monitoring et alertes

Métriques prioritaires :

MétriqueSeuil d'alerteOutil
Consumer lag (Kafka)> 10 000 msgs pendant 5 minkafka-consumer-groups / Grafana
Profondeur de queue> 80 % capacité configuréeRabbitMQ Management API
DLQ depth> 0 (toute erreur)Prometheus alert
Throughput drop-50 % vs baselineDatadog / Grafana
Message age max> SLA définiCloudwatch / Azure Monitor
# Vérifier le lag Kafka
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
  --describe --group orders-consumer-group

Anti-patterns et pièges

Bonnes pratiques 2026