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 pourrait permettre à un utilisateur de corriger les problèmes et de renvoyer le message.

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 les opérations normales telles que la livraison en mode aperçu et verrouillage, la réception et suppression, 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.

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

Dans .NET, vous pouvez utiliser la méthode FormatDeadLetterPath.

QueueClient.FormatDeadLetterPath(queuePath)
SubscriptionClient.FormatDeadLetterPath(topicPath, subscriptionName)

Nombre de messages en file d’attente de lettres mortes

L’obtention du nombre de messages dans la file d’attente de lettres mortes au niveau du sujet n’est pas applicable, car 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 montrant 62 messages dans la file d’attente des lettres mortes.

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 dépassé la limite.
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.
Session ID is 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 les files d’attente a dépassé la limite. 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.

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.

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 est livré sous un verrouillage d’aperçu, mais qu’il est explicitement abandonné ou que le verrou a expiré, le compteur de livraison 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.

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 où vous avez des types de messages qui sont envoyés au sujet, mais qui n’ont pas d’abonnés, car cela peut entraîner une grande charge de messages DLQ. Par conséquent, assurez-vous que tous les messages envoyés au sujet ont au moins un abonnement correspondant.

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.

Dans .NET, cela peut être effectué 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. Soyez conscient que cela pourrait entraîner pour certains messages un dépassement de la limite de quota de 256 Ko pour le niveau Standard d’Azure Service Bus. Vous pouvez mettre à niveau votre espace de noms Service Bus du niveau standard au niveau premium pour bénéficier de quotas et de limites plus élevés.

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 le sujet de destination est désactivé, le message est envoyé à la file d’attente de lettres mortes de transfert (TDLQ) de la file d’attente source.
  • 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.

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

Une fois que vous avez résolu le problème qui entraînait la mise en file d’attente de lettres mortes du message, vous pouvez le renvoyer à la file d’attente ou au sujet.

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 afin de pouvoir identifier quels types de messages ont échoué au traitement, de quelles files d’attente sources ils proviennent et pour quelles raisons, tout en ayant les moyens de resoumettre des lots de messages à retraiter. Des outils tels que ServicePulse avec NServiceBus offrent ces fonctionnalités.

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.