Il arrive que des messages échouent : un consommateur les rejette, le nombre maximal de tentatives est atteint ou la durée de vie (TTL) expire. Plutôt que de perdre ces messages, un échange de lettres mortes (DLX) les capture et les achemine vers une file d'attente dédiée pour inspection, retraitement ou alerte.
Les sections suivantes présentent les concepts clés, le processus de routage, les méthodes de configuration et les en-têtes des lettres mortes pour ApsaraMQ for RabbitMQ.
Concepts clés
| Terme | Définition |
|---|---|
| Échange de lettres mortes | Un échange qui reçoit les lettres mortes et les achemine vers une file d'attente de lettres mortes en fonction des clés de liaison, des clés de routage et des attributs d'en-tête. Tout type d'échange standard (direct, fanout, topic ou headers) peut servir d'échange de lettres mortes. |
| Clé de routage des lettres mortes | La clé de routage utilisée pour acheminer une lettre morte. Si elle n'est pas spécifiée, le message conserve sa clé de routage d'origine. |
| Lettre morte | Un message transféré vers un échange de lettres mortes. Consultez Quand les messages deviennent-ils des lettres mortes ? pour obtenir la liste complète des déclencheurs. |
| File d'attente de lettres mortes | Une file d'attente liée à un échange de lettres mortes qui stocke les lettres mortes. |
Quand les messages deviennent-ils des lettres mortes ?
Un message est envoyé vers l'échange de lettres mortes lorsque l'un des événements suivants se produit :
Accusé de réception négatif : un consommateur appelle
basic.rejectoubasic.nackavecrequeuedéfini surfalse.Épuisement des nouvelles tentatives : la consommation du message échoue après 16 tentatives. Pour plus de détails, consultez Politiques de nouvelle tentative de consommation.
Expiration de la TTL : le message reste dans la file d'attente plus longtemps que la durée de vie (TTL) configurée. Pour plus de détails, consultez Durée de vie des messages (TTL).
Fonctionnement
Un producteur publie un message vers un échange.
L'échange achemine le message vers une file d'attente.
Un consommateur extrait le message de la file d'attente.
Le message devient une lettre morte : suite à un accusé de réception négatif, après 16 échecs de nouvelle tentative ou à l'expiration de sa TTL.
La file d'attente transfère la lettre morte vers l'échange spécifié par
x-dead-letter-exchange, en utilisant la clé de routage spécifiée parx-dead-letter-routing-key.L'échange de lettres mortes achemine le message vers la file d'attente de lettres mortes liée.

Remarques d'utilisation
Exigence de vhost identique : l'échange de lettres mortes et sa file d'attente liée doivent résider dans le même vhost. Le routage des lettres mortes entre différents vhosts n'est pas pris en charge.
Liaison DLX immuable : une fois qu'une file d'attente est créée avec un échange de lettres mortes, la configuration DLX ne peut pas être modifiée. Supprimez la file d'attente et créez-en une nouvelle avec la configuration mise à jour.
Aucune configuration DLX : si aucune file d'attente ne dispose d'un échange de lettres mortes configuré, les messages sont définitivement supprimés une fois le nombre maximal de tentatives de livraison (16 par défaut) dépassé. Si un échange de lettres mortes est configuré, les messages sont acheminés vers la file d'attente de lettres mortes correspondante.
Configurer un échange de lettres mortes
Configurez un échange de lettres mortes via la console ApsaraMQ for RabbitMQ, l'API CreateQueue ou un SDK client.
Console
Configurez un échange de lettres mortes lors de la création d'une file d'attente dans la console.
Connectez-vous à la console ApsaraMQ for RabbitMQ.
Sur la page Overview, dans la section Resource Distribution, sélectionnez une région.
Sur la page Instances, cliquez sur le nom de l'instance cible.
Dans le volet de navigation de gauche, cliquez sur Queues.
Sur la page Queues, sélectionnez un vhost dans la liste déroulante Change située à côté de vhost, puis cliquez sur Create Queue.
Dans le panneau Create Queue, définissez les paramètres suivants, puis cliquez sur OK.
| Paramètre | Description |
|---|---|
| Queue Name | Nom de la file d'attente. Prend en charge les lettres, les chiffres, les traits d'union (-), les traits de soulignement (_), les points (.), les dièses (#), les barres obliques (/) et les arobases (@). Longueur : 1 à 255 caractères. Ne peut pas être modifié après la création. Le préfixe amq. est réservé et ne peut pas être utilisé. |
| Auto Delete | Indique s'il faut supprimer automatiquement la file d'attente après la désabonnement du dernier consommateur. Valeurs valides : true, false. |
| Advanced Settings | Cliquez pour développer. Configurez l'échange de lettres mortes et les paramètres associés : |
| - DeadLetterExchange | L'échange qui reçoit les lettres mortes provenant de cette file d'attente. |
| - DeadLetterRoutingKey | La clé de routage pour les lettres mortes. L'échange de lettres mortes utilise cette clé pour acheminer les messages vers la file d'attente de lettres mortes correspondante. |
| - MessageTTL | La durée de vie (TTL) du message en millisecondes. Les messages non consommés dans ce délai deviennent des lettres mortes et sont transférés vers l'échange de lettres mortes. Pour plus de détails, consultez Durée de vie des messages (TTL). |
API
Appelez l'opération CreateQueue avec les paramètres de l'échange de lettres mortes. Pour plus de détails, consultez CreateQueue.
Client SDK
Spécifiez x-dead-letter-exchange et x-dead-letter-routing-key dans les arguments de la file d'attente lors de la déclaration de celle-ci.
L'exemple Java suivant déclare un échange direct nommé some.exchange.name comme échange de lettres mortes avec demo-routing-key comme clé de routage des lettres mortes :
channel.exchangeDeclare("some.exchange.name", "direct");
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-dead-letter-exchange", "some.exchange.name");
args.put("x-dead-letter-routing-key", "demo-routing-key");
channel.queueDeclare("MyQueue", false, false, false, args);
En-têtes des lettres mortes
Lorsqu'un message devient une lettre morte, ApsaraMQ for RabbitMQ ajoute des en-têtes de métadonnées pour suivre l'historique des événements.
En-têtes récapitulatifs
| En-tête | Description |
|---|---|
x-first-death-exchange |
L'échange dans lequel se trouvait le message lors de son premier rejet. |
x-first-death-queue |
La file d'attente dans laquelle se trouvait le message lors de son premier rejet. |
x-first-death-reason |
La raison pour laquelle le message a été rejeté pour la première fois. |
x-death-total |
Le nombre total de fois où le message a été rejeté. |
Le tableau x-death
L'en-tête x-death est un tableau d'entrées, chacune enregistrant un événement de rejet avec les champs suivants :
| Champ | Description |
|---|---|
reason |
Raison pour laquelle le message a été rejeté. |
queue |
La file d'attente dans laquelle se trouvait le message lors du rejet. |
exchange |
L'échange vers lequel le message a été publié avant d'être rejeté. |
routing-keys |
Les clés de routage du message au moment du rejet. |
count |
Nombre de fois où le message a été rejeté depuis cette file d'attente pour cette raison. |
time |
Moment où le message a été rejeté. |
Valeurs des raisons de rejet
| Valeur | Déclencheur |
|---|---|
expired |
La TTL du message a expiré. |
nack |
Le message a fait l'objet d'un accusé de réception négatif avec requeue défini sur false. |
reject |
Le message a été rejeté avec requeue défini sur false. |
Consumption limit exceeded |
Le message a échoué après 16 tentatives de nouvelle tentative. |
Activer la TTL pour les files d'attente de lettres mortes
Par défaut, les messages d'une file d'attente de lettres mortes n'expirent pas, même si une TTL est configurée pour la file d'attente. Activez la fonctionnalité TTL au niveau de l'instance pour permettre aux lettres mortes de respecter le paramètre TTL de la file d'attente. Lorsque la TTL d'une lettre morte expire, elle est transférée vers le prochain échange de lettres mortes configuré.
Types d'instances pris en charge
La fonctionnalité TTL pour les files d'attente de lettres mortes est disponible sur les types d'instances suivants :
Serverless
Enterprise Edition (Subscription)
Platinum Edition (Subscription)
Procédure
Sur la page Instances de la console ApsaraMQ for RabbitMQ, cliquez sur le nom de l'instance cible.
Sur la page Instance Details, cliquez sur l'onglet Limits.
Cliquez sur Activate à côté de TTL Feature Supported.
Évitez de créer des boucles de routage de lettres mortes. Par exemple, si la file d'attente de lettres mortes de la file A est la file B et que celle de la file B est la file A, les messages bouclent indéfiniment. Si ApsaraMQ for RabbitMQ détecte une telle boucle sans événement de rejet, il désactive automatiquement la TTL pour les messages concernés afin d'arrêter la boucle.
Une lettre morte peut être routée entre les files d'attente un maximum de 16 fois. Après avoir atteint cette limite, la TTL est désactivée pour les messages concernés.
Étapes suivantes
Gérer les échanges : supprimez un échange de lettres mortes ou liez une file d'attente de lettres mortes à un échange de lettres mortes.
Durée de vie des messages (TTL) : définissez les délais d'expiration des messages.
Politiques de nouvelle tentative de consommation : configurez le comportement de nouvelle tentative avant que les messages ne deviennent des lettres mortes.