Configuration des files d'attente et des échanges durables pour une messagerie fiable
Configurez les files d'attente, échanges, liaisons et messages persistants RabbitMQ durables afin que les travaux critiques puissent survivre aux redémarrages du courtier.
Configuration des files d'attente et des échanges durables pour une messagerie fiable
Lorsque vos applications utilisent RabbitMQ pour des tâches, commandes ou notifications, un redémarrage du courtier ne devrait pas effacer le travail encore en attente dans une file d'attente. Les files d'attente durables, les échanges durables, les liaisons durables et les messages persistants sont les éléments qui rendent RabbitMQ fiable lors des redémarrages.
Ce guide présente les paramètres nécessaires, les erreurs courantes et comment vérifier le comportement avant de faire confiance en production.
Comprendre la durabilité vs la persistance
Avant de configurer, il est crucial de distinguer les deux concepts principaux liés à la survie des messages :
- Durabilité de la file d'attente : Fait référence à la définition de la file d'attente elle-même. Une définition de file d'attente durable survit à un redémarrage du courtier. Si la file d'attente est déclarée comme non durable, elle est supprimée lorsque le courtier s'arrête.
- Durabilité de l'échange : Fait référence à la définition de l'échange. Les échanges durables survivent aux redémarrages ; les échanges non durables sont supprimés lorsque le courtier s'arrête.
- Durabilité de la liaison : Les liaisons entre les échanges durables et les files d'attente durables sont récupérées avec la topologie durable. Les liaisons impliquant des entités transitoires disparaissent avec ces entités.
- Persistance des messages : Fait référence à la manière dont les messages individuels sont traités. Un message persistant est écrit sur le disque par le courtier, garantissant sa survie lors d'un redémarrage, même si la file d'attente elle-même est durable. Les messages marqués comme transitoires (non persistants) sont conservés uniquement en mémoire et peuvent être perdus lors d'un redémarrage.
Pour qu'un message survive à un redémarrage du courtier, la file d'attente doit être durable et le message doit être publié comme persistant. Dans une publication routée normale, l'échange et la liaison doivent également revenir pour que les producteurs et consommateurs puissent continuer à utiliser la même topologie.
Étape 1 : Déclarer une file d'attente durable
Les files d'attente doivent être explicitement déclarées comme durables lors de leur création. Cela indique à RabbitMQ de sauvegarder les métadonnées de la file d'attente sur le disque afin qu'elles puissent être recréées automatiquement lorsque le courtier revient en ligne.
Cette configuration est généralement effectuée via la bibliothèque client (client AMQP) se connectant au courtier. Voici des exemples illustrant la déclaration dans des outils courants.
Exemple avec l'interface CLI rabbitmqadmin (ou outil similaire)
Lors de la déclaration d'une file d'attente à l'aide d'outils en ligne de commande, vous spécifiez l'argument durable comme true.
# Commande pour déclarer une file d'attente nommée 'high_priority_tasks' comme durable
rabbitmqadmin declare queue name=high_priority_tasks durable=true
Exemple avec Python (bibliothèque pika)
Dans un contexte programmatique, le paramètre durable dans la méthode channel.queue_declare() doit être défini sur True.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
queue_name = 'order_processing_queue'
channel.queue_declare(
queue=queue_name,
durable=True # <-- Définition de la durabilité ici
)
print(f"File d'attente '{queue_name}' déclarée comme durable.")
# connection.close() # (Fermer la connexion après d'autres opérations)
Avertissement sur la déclaration de file d'attente : Si une file d'attente existe déjà et que vous essayez de la redéclarer avec des attributs différents (par exemple, passer de non durable à durable), RabbitMQ générera une erreur (
Precondition Failedou similaire) car les files d'attente existantes ne peuvent pas changer leur statut de durabilité.
Étape 2 : Déclarer un échange durable
Les échanges, qui routent les messages vers les files d'attente, doivent également être déclarés comme durables si vous comptez sur eux pour survivre à un redémarrage du courtier. Si un échange est non durable, il sera supprimé lors du redémarrage, et toutes les liaisons qui lui sont associées seront également perdues.
Exemple avec Python (bibliothèque pika pour la déclaration d'échange)
Comme pour les files d'attente, les échanges nécessitent que l'argument durable soit défini sur True lors de la déclaration.
import pika
# Supposons que la connexion et le canal sont déjà établis
exchange_name = 'critical_events_exchange'
channel.exchange_declare(
exchange=exchange_name,
exchange_type='direct',
durable=True
)
print(f"Échange '{exchange_name}' déclaré comme durable.")
Étape 3 : Publier des messages persistants
Déclarer des files d'attente et des échanges durables garantit uniquement la survie de la topologie. Pour garantir que les messages eux-mêmes survivent, l'éditeur doit marquer les propriétés du message comme persistantes.
Lors de la publication, vous définissez la propriété delivery_mode sur 2 (ce qui signifie persistant).
Exemple : Publication de messages persistants (Pika)
Dans l'appel channel.basic_publish, l'argument properties est utilisé pour définir la persistance du message.
import pika
from pika import BasicProperties
# ... configuration du canal ...
message_body = "Cette commande ne doit pas être perdue !"
exchange = 'critical_events_exchange'
routing_key = 'urgent'
channel.basic_publish(
exchange=exchange,
routing_key=routing_key,
body=message_body,
properties=BasicProperties(
delivery_mode=2 # <-- Mode de livraison 2 = Persistant
)
)
print("Message publié de manière persistante.")
Meilleure pratique : Confirmations de l'éditeur : Bien que la persistance sauvegarde les données lors d'un redémarrage du courtier, elle ne garantit pas que le courtier a reçu le message avant que l'application éditrice ne plante. Pour une fiabilité maximale, associez toujours les configurations durables/persistantes avec les confirmations de l'éditeur pour recevoir un accusé de réception du courtier indiquant que le message a été écrit en toute sécurité sur le disque.
Étape 4 : Lier les composants durables
Une fois la file d'attente durable et l'échange persistant créés, vous devez les lier ensemble. Les liaisons définissent la logique de routage. Si l'échange est durable, les liaisons qui lui sont associées doivent généralement également être durables pour garantir que la structure de routage est immédiatement fonctionnelle après le redémarrage du courtier.
# ... configuration du canal ...
exchange_name = 'critical_events_exchange'
queue_name = 'order_processing_queue'
routing_key = 'urgent'
channel.queue_bind(
exchange=exchange_name,
queue=queue_name,
routing_key=routing_key
)
print(f"Liaison établie entre {exchange_name} et {queue_name}.")
Dans RabbitMQ, les liaisons entre les files d'attente durables et les échanges durables sont durables. Si l'un des côtés est transitoire, la liaison ne peut pas survivre à cette entité.
Résumé de la liste de contrôle de fiabilité
Pour atteindre une fiabilité de bout en bout des messages contre les pannes du courtier, assurez-vous que les trois composants sont correctement configurés :
| Composant | Configuration requise | Objectif |
|---|---|---|
| File d'attente | durable=True |
Survit au redémarrage du courtier (métadonnées sauvegardées). |
| Échange | durable=True |
Survit au redémarrage du courtier (topologie sauvegardée). |
| Liaison | File d'attente durable liée à un échange durable | La relation de routage est récupérée après le redémarrage. |
| Message | delivery_mode=2 (Persistant) |
Survit au redémarrage du courtier (données écrites sur le disque). |
À retenir
La durabilité dans RabbitMQ n'est pas un interrupteur unique. Déclarez des files d'attente et des échanges durables, liez des entités durables, publiez des messages avec delivery_mode=2 et activez les confirmations de l'éditeur pour que votre éditeur sache que RabbitMQ a accepté le message. Ensuite, redémarrez un courtier non en production et vérifiez que la file d'attente, la liaison et le message persistant non consommé sont toujours présents.