Définition
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 prêt.
C'est un élément fondamental des architectures microservices et des systèmes distribues.
Pourquoi utiliser une message queue ?
- Decoupling : les services n'ont pas besoin de se connaître directement
- Résilience : si le consommateur est en panne, les messages attendent dans la queue
- Scalabilité : ajoutez des consommateurs pour traiter plus de messages en parallèle
- 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. Idéal pour la répartition de tâches.
Pub/Sub (Topic)
Un message est diffuse a tous les abonnes. Idéal pour les notifications et l'event streaming.
Request-Reply
Le producteur attend une réponse du consommateur. Simule un appel synchrone de manière asynchrone.
Solutions populaires
| Solution | Type | Debit | Persistance | Cas d'usage |
|---|---|---|---|---|
| RabbitMQ | Message broker | Modéré | Optionnelle | Task queues, RPC |
| Apache Kafka | Event streaming | Très élevé | Oui (log) | Event sourcing, analytics |
| AWS SQS | Queue gérée | Modéré | Oui | Tasks async sur AWS |
| Redis Streams | Léger | Eleve | Optionnelle | Cache + messaging |
| NATS | Lightweight | Très élevé | 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 après plusieurs tentatives, il est envoye dans une Dead Letter Queue pour analyse et retraitement manuel. C'est un filet de sécurité indispensable.
Garanties de livraison
- At most once : le message peut être perdu (rapide mais risque)
- At least once : le message peut être duplique (fiable, le plus courant)
- Exactly once : chaque message est traite une seule fois (complexe, Kafka Transactions)