Vue d’ensemble des files d’attente de lettres mortes Service Bus

Les files d’attente et abonnements aux rubriques Azure Service Bus fournissent une sous-file d’attente secondaire, appelée file d’attente de lettres mortes. La file d’attente de lettres mortes n’a pas besoin d’être explicitement créée et ne peut pas être supprimée ni gérée indépendamment de l’entité principale.

Cet article décrit les files d’attente de lettres mortes dans Service Bus. Une grande partie de la discussion est illustrée par l’exemple de files d’attente de lettres mortes qui se trouve sur GitHub.

La file d’attente de lettres mortes

L’objectif de la file d’attente de lettres mortes est de conserver les messages qui ne peuvent pas être remis aux destinataires ou les messages qui n’ont pas pu être traités. Les messages peuvent alors être supprimés de la file d’attente de lettres mortes et inspectés. Une application peut, à l’aide d’un opérateur, corriger les problèmes et renvoyer le message, consigner le fait qu’une erreur s’est produite et prendre des mesures correctives.

Du point de vue de l’API et du protocole, la file d’attente de lettres mortes est essentiellement similaire à une autre file d’attente, sauf que les messages peuvent être envoyés uniquement par le biais de l’opération de lettres mortes de l’entité parente. En outre, la durée de vie n’est pas observée, et vous ne pouvez pas supprimer un message d’une file d’attente de lettres mortes. La file d’attente de lettres mortes prend entièrement en charge la remise de verrou d’affichage et les opérations transactionnelles.

Il n’y a aucun nettoyage automatique de la file d’attente de lettres mortes. Les messages restent dans la file d’attente de lettres mortes jusqu’à ce que vous les récupériez explicitement et que vous complétiez le message de lettres mortes.

Nombre de messages en file d’attente de lettres mortes

Il n’est pas possible de connaître le nombre de messages en file d’attente de lettres mortes au niveau de la rubrique. Cela tient au fait que les messages ne se trouvent pas au niveau du sujet. Au lieu de cela, lorsqu’un expéditeur envoie un message à une rubrique, le message est transféré aux abonnements de la rubrique en quelques millisecondes et ne réside donc plus au niveau de la rubrique. Par conséquent, vous pouvez voir les messages dans la file d’attente de lettres mortes associée à l’abonnement de la rubrique. Dans l’exemple suivant, Service Bus Explorer indique qu’il y a actuellement 62  messages dans la file d’attente de lettres mortes pour l’abonnement « test1 ».

Image showing 62 messages in the dead-letter queue.

Vous pouvez également récupérer le nombre de messages en file d’attente de lettres mortes à l’aide de la commande Azure CLI : az servicebus topic subscription show.

Déplacer des messages vers la file d’attente de lettres mortes

Plusieurs activités dans Service Bus entraînent l’envoi des messages dans la file d’attente de lettres mortes à partir du moteur de messagerie lui-même. Une application peut également explicitement déplacer des messages dans la file d’attente de lettres mortes. Les deux propriétés suivantes (motif de lettres mortes et description de lettres mortes) sont ajoutées aux messages de lettres mortes. Les applications peuvent définir leurs propres codes pour la propriété de motif de lettres mortes, mais le système définit les valeurs suivantes.

Motif de lettres mortes Description de l’erreur de lettres mortes
HeaderSizeExceeded Le quota de taille pour ce flux a été dépassé.
TTLExpiredException Le message a expiré et a été placé dans la file d’attente de lettres mortes. Pour plus d’informations, consultez la section relative à la Durée de vie.
L’ID de session a la valeur Null. L’entité activée dans la session n’autorise pas les messages dont l’identificateur de session a la valeur null.
MaxTransferHopCountExceeded Le nombre maximal de sauts autorisés lors du transfert entre files d’attente a été dépassé. Cette valeur est définie sur 4.
MaxDeliveryCountExceeded Le message n’a pas pu être consommé après un nombre de tentatives de livraison maximal. Pour plus d’informations, consultez la section Nombre maximal de remises.

Nombre maximal de diffusions

Il existe une limite du nombre de tentatives de remise des messages pour LES files d’attente et les abonnements Service Bus. La valeur par défaut est 10. Chaque fois qu’un message a été remis sous un verrou, mais qu’il a été explicitement abandonné ou que le verrou a expiré, le compteur de remises du message est incrémenté. Lorsque le nombre de remises dépasse la limite, le message est déplacé vers la file d’attente de lettres mortes. Le motif de lettres mortes du message dans la file d’attente est défini sur : MaxDeliveryCountExceeded. Ce comportement ne peut pas être désactivé, mais vous pouvez définir le nombre maximal de diffusions sur un grand nombre.

Durée de vie

Lorsque vous activez les lettres mortes sur les files d’attente ou les abonnements, tous les messages arrivant à expiration sont déplacés vers la file d’attente de lettres mortes. Le code de motif de lettres mortes est défini sur : TTLExpiredException.

Les messages différés ne seront ni vidés ni déplacés vers la file d’attente de lettres mortes après leur expiration. Ce comportement est normal.

Erreurs pendant le traitement des règles d’abonnement

Si vous activez les lettres mortes sur les exceptions d’évaluation de filtre, toutes les erreurs qui se produisent pendant l’exécution d’une règle de filtre SQL d’un abonnement sont capturées dans la file d’attente de lettres mortes avec le message incriminé. N’utilisez pas cette option dans un environnement de production dans lequel certains types de messages n’ont pas d’abonnés.

Mise en file d’attente de lettres mortes au niveau de l’application

En plus des fonctionnalités de file d’attente de lettres mortes fournies par le système, les applications peuvent utiliser la file d’attente de lettres mortes pour refuser explicitement les messages inacceptables. Il peut s’agir de messages qui ne peuvent pas être traités correctement en raison d’un problème système, de messages qui contiennent des charges utiles incorrectement formées ou de messages qui n’ont pas pu être authentifiés lors de l’utilisation d’un schéma de sécurité au niveau du message.

Cette opération peut être effectuée en appelant la méthode ServiceBusReceiver.DeadLetterMessageAsync.

Nous vous recommandons d’inclure le type de l’exception dans DeadLetterReason et l’arborescence des appels de procédure de l’exception dans DeadLetterDescription, car cela facilite la résolution de la cause du problème entraînant la mise en file d’attente de lettres mortes des messages. N’oubliez pas que cela peut entraîner pour certains messages un dépassement de la limite de quota de 256 Ko pour le niveau Standard d’Azure Service Bus, indiquant plus précisément que le niveau Premium doit être utilisé pour les environnements de production.

Lettres mortes dans les scénarios de transfert automatique

Les messages sont envoyés à la file d’attente de lettres mortes dans les conditions suivantes :

  • Un message passe par plus de quatre files d’attente ou rubriques enchaînées.
  • La file d’attente de destination ou la rubrique est désactivée ou supprimée.
  • La file d’attente ou la rubrique de destination dépasse la taille d’entité maximale.

Lettres mortes dans les scénarios d’envoi indirect

  • Si la file d’attente ou la rubrique de destination est désactivée, le message est envoyé à une file d’attente de lettres mortes de transfert (TDLQ) de la file d’attente source.
  • Si la file d’attente ou la rubrique de destination est supprimée, l’exception 404 est levée.
  • Si la file d’attente ou l’entité de destination dépasse la taille de l’entité, le message est envoyé à une TDLQ de la file d’attente source.

Chemin d’accès à la file d’attente de lettres mortes

Vous pouvez accéder à la file d’attente de lettres mortes à l’aide de la syntaxe suivante :

<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue

Envoi de messages en file d’attente de lettres mortes à retraiter

Dans la mesure où il peut exister des données métier précieuses dans les messages placés en file d’attente de lettres mortes, il est souhaitable de retraiter ces messages une fois que les opérateurs ont fini de gérer les circonstances ayant entraîné leur placement en file d’attente de lettres mortes.

Les outils tels qu’Azure Service Bus Explorer permettent le déplacement manuel des messages entre les files d’attente et les rubriques. Si de nombreux messages en file d’attente de lettres mortes doivent être déplacés, vous pouvez les déplacer tous en même temps via du code semblable à celui-ci. Les opérateurs préfèrent souvent disposer d’une interface utilisateur pour pouvoir identifier les types de messages non traités, les files d’attente sources et les raisons de l’échec, tout en ayant les moyens de resoumettre des lots de messages à retraiter. Des outils tels que ServicePulse avec NServiceBus offrent ces fonctionnalités.

Étapes suivantes

Consultez Activer la mise en file d’attente de lettres mortes pour une file d’attente ou un abonnement pour en savoir plus sur les différentes façons de configurer le paramètre de mise en file d’attente de lettres mortes à l’expiration du message.