Definition
Une message queue (file de messages) est un composant logiciel qui permet la communication asynchrone entre services en stockant temporairement les messages dans une file d'attente. Le producteur envoie un message, la queue le stocke, et le consommateur le traite quand il est pret.
C'est un element fondamental des architectures microservices et des systemes distribues.
Pourquoi utiliser une message queue ?
- Decoupling : les services n'ont pas besoin de se connaitre directement
- Resilience : si le consommateur est en panne, les messages attendent dans la queue
- Scalabilite : ajoutez des consommateurs pour traiter plus de messages en parallele
- Lissage de charge : absorbe les pics de trafic sans surcharger les services en aval
Patterns de messaging
Point-to-Point (Queue)
Un message est consomme par un seul consommateur. Ideal pour la repartition de taches.
Pub/Sub (Topic)
Un message est diffuse a tous les abonnes. Ideal pour les notifications et l'event streaming.
Request-Reply
Le producteur attend une reponse du consommateur. Simule un appel synchrone de maniere asynchrone.
Solutions populaires
| Solution | Type | Debit | Persistance | Cas d'usage |
|---|---|---|---|---|
| RabbitMQ | Message broker | Modere | Optionnelle | Task queues, RPC |
| Apache Kafka | Event streaming | Tres eleve | Oui (log) | Event sourcing, analytics |
| AWS SQS | Queue geree | Modere | Oui | Tasks async sur AWS |
| Redis Streams | Leger | Eleve | Optionnelle | Cache + messaging |
| NATS | Lightweight | Tres eleve | Optionnelle | Microservices, IoT |
Exemple : RabbitMQ avec Node.js
// Producteur
const channel = await connection.createChannel();
await channel.assertQueue('emails');
channel.sendToQueue('emails', Buffer.from(JSON.stringify({
to: 'user@exemple.com',
subject: 'Bienvenue',
template: 'welcome'
})));
// Consommateur
channel.consume('emails', async (msg) => {
const email = JSON.parse(msg.content.toString());
await sendEmail(email);
channel.ack(msg); // confirmer le traitement
});
Dead Letter Queue (DLQ)
Quand un message echoue apres plusieurs tentatives, il est envoye dans une Dead Letter Queue pour analyse et retraitement manuel. C'est un filet de securite indispensable.
Garanties de livraison
- At most once : le message peut etre perdu (rapide mais risque)
- At least once : le message peut etre duplique (fiable, le plus courant)
- Exactly once : chaque message est traite une seule fois (complexe, Kafka Transactions)