Übersicht über Service Bus-Warteschlangen für unzustellbare Nachrichten
Azure Service Bus-Warteschlangen und -Themenabonnements verfügen über eine sekundäre Unterwarteschlange, die als Warteschlange für unzustellbare Nachrichten (Dead Letter Queue, DLQ) bezeichnet wird. Die Warteschlange für unzustellbare Nachrichten muss nicht explizit erstellt werden, und kann nicht gelöscht oder unabhängig von der Hauptentität verwaltet werden.
Dieser Artikel erläutert Warteschlangen für unzustellbare Nachrichten in Service Bus. Ein Großteil der Informationen wird durch das Beispiel Dead-Letter Queues auf GitHub veranschaulicht.
Die Warteschlange für unzustellbare Nachrichten
Die Warteschlange für unzustellbare Nachrichten dient zum Speichern von Nachrichten, die an keinen Empfänger übermittelt oder nicht verarbeitet werden können. Nachrichten können dann aus dieser Warteschlange entfernt und überprüft werden. Eine Anwendung kann es Benutzern und Benutzerinnen ermöglichen, Probleme zu beheben und die Nachricht erneut zu übermitteln.
Im Hinblick auf API und Protokoll ähnelt die Warteschlange für unzustellbare Nachrichten weitgehend anderen Warteschlangen, mit der Ausnahme, dass Nachrichten nur durch die übergeordnete Entität über den Vorgang für unzustellbare Nachrichten gesendet werden können. Darüber hinaus ist die Gültigkeitsdauer nicht relevant, und eine Nachricht kann nicht von einer Warteschlange für unzustellbare Nachrichten aus als unzustellbar gekennzeichnet werden. Die Warteschlange für unzustellbare Nachrichten unterstützt normale Vorgänge wie Zustellung mit Vorschausperre, Empfangs- und Löschvorgänge sowie Transaktionsvorgänge uneingeschränkt.
Es wird keine automatische Bereinigung der Warteschlange für unzustellbare Nachrichten durchgeführt. Nachrichten verbleiben in dieser Warteschlange, bis Sie sie explizit daraus abrufen und abschließen.
Pfad zur Warteschlange für unzustellbare Nachrichten
Sie können auf die Warteschlange für unzustellbare Nachrichten zugreifen, indem Sie die folgende Syntax verwenden:
<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue
In .NET können Sie die FormatDeadLetterPath
-Methode verwenden.
QueueClient.FormatDeadLetterPath(queuePath)
SubscriptionClient.FormatDeadLetterPath(topicPath, subscriptionName)
Nachrichtenanzahl der Warteschlange für unzustellbare Nachrichten
Die Anzahl der Nachrichten in der Warteschlange für unzustellbare Nachrichten kann nicht auf Themenebene ermittelt werden, weil die Nachrichten nicht nach Themen strukturiert sind. Wenn ein Absender eine Nachricht an ein Thema sendet, wird diese stattdessen innerhalb von Millisekunden an Abonnements für das Thema weitergeleitet und ist daher nicht mehr auf der Themenebene vorhanden. Sie können Nachrichten in der Warteschlange für unzustellbare Nachrichten anzeigen, die dem Abonnement für das Thema zugeordnet ist. Im folgenden Beispiel wird im Service Bus Explorer angegeben, dass sich in der Warteschlange für unzustellbare Nachrichten für das Abonnement „test1“ derzeit 62 Nachrichten befinden.
Sie können die Anzahl von Nachrichten in der Warteschlange für unzustellbare Nachrichten auch abrufen, indem Sie den folgenden Azure CLI-Befehl verwenden: az servicebus topic subscription show
.
Verschieben von Nachrichten in die Warteschlange für unzustellbare Nachrichten
Es gibt verschiedene Aktivitäten in Service Bus, durch welche Nachrichten aus dem Messaging-Engine selbst per Push in die Warteschlange für unzustellbare Nachrichten übertragen werden. Eine Anwendung kann Nachrichten auch explizit in die Warteschlange für unzustellbare Nachrichten verschieben. Die folgenden beiden Eigenschaften (Ursache und Beschreibung für unzustellbare Nachricht) werden zu unzustellbaren Nachrichten hinzugefügt. Anwendungen können ihre eigenen Codes für die Eigenschaft „Ursache für unzustellbare Nachricht“ definieren, aber das System legt die folgenden Werte fest:
Ursache für unzustellbare Nachrichten | Fehlerbeschreibung für unzustellbare Nachrichten |
---|---|
HeaderSizeExceeded |
Das Größenkontingent für diesen Datenstrom hat den Grenzwert überschritten. |
TTLExpiredException |
Die Nachricht ist abgelaufen und wurde in die Warteschlange für unzustellbare Nachrichten verschoben. Weitere Informationen finden Sie im Abschnitt Gültigkeitsdauer. |
Session ID is null . |
Die für die Sitzung aktivierte Entität erlaubt keine Nachricht, deren Sitzungsbezeichner null ist. |
MaxTransferHopCountExceeded |
Die maximale Anzahl zulässiger Hops beim Weiterleiten zwischen Warteschlangen hat den Grenzwert überschritten. Dieser Wert ist auf 4 festgelegt. |
MaxDeliveryCountExceeded |
Die Nachricht konnte nach der maximalen Anzahl der Übermittlungsversuche nicht verarbeitet werden. Weitere Informationen finden Sie im Abschnitt Maximale Übermittlungsanzahl. |
Gültigkeitsdauer
Wenn Sie unzustellbare Nachrichten für Warteschlangen oder Abonnements aktivieren, werden alle Nachrichten nach ihrem Ablauf in die Warteschlange für unzustellbare Nachrichten verschoben. Der Ursachencode für die unzustellbare Nachricht wird festgelegt auf: TTLExpiredException
. Zurückgestellte Nachrichten werden nicht gelöscht oder in die Warteschlange für unzustellbare Nachrichten verschoben, nachdem sie abgelaufen sind. Dieses Verhalten ist beabsichtigt.
Maximale Übermittlungsanzahl
Die Anzahl der Übermittlungsversuche von Nachrichten für Service Bus-Warteschlangen und -Abonnements ist begrenzt. Der Standardwert ist 10. Jedes Mal, wenn eine Nachricht mit einer Vorschausperre zugestellt wird, die Zustellung aber entweder explizit abgebrochen wird oder die Sperre abgelaufen ist, wird die Zustellungsanzahl der Nachricht erhöht. Wenn die Übermittlungsanzahl den Grenzwert überschreitet, wird die Nachricht in die Warteschlange für unzustellbare Nachrichten verschoben. Die Ursache für die unzustellbare Nachricht in der Warteschlange wird festgelegt auf: MaxDeliveryCountExceeded
. Dieses Verhalten kann nicht deaktiviert werden, aber Sie können die maximale Übermittlungsanzahl erhöhen.
Fehler beim Verarbeiten von Regeln für Abonnements
Wenn Sie unzustellbare Nachrichten bei Ausnahmen für die Filterauswertung aktivieren, werden alle Fehler, die während der Ausführung der SQL-Filterregel eines Abonnements auftreten, zusammen mit der verursachenden Nachricht in der Warteschlange für unzustellbare Nachrichten erfasst. Verwenden Sie diese Option nicht in einer Produktionsumgebung mit Nachrichtentypen, die an Themen gesendet werden, die über keine Abonnenten verfügen, da dies zu einer großen Anzahl von Nachrichten in der Warteschlange für unzustellbare Nachrichten (DLQ) führen kann. Stellen Sie daher sicher, dass alle Nachrichten, die an ein Thema gesendet werden, über mindestens ein entsprechendes Abonnement verfügen.
Unzustellbare Nachrichten auf Anwendungsebene
Zusätzlich zu den vom System bereitgestellten Features für unzustellbare Nachrichten können Anwendungen die Warteschlange für unzustellbare Nachrichten verwenden, um nicht annehmbare Nachrichten explizit abzulehnen. Hierzu zählen beispielsweise Nachrichten, die aufgrund eines bestimmten Systemproblems nicht richtig verarbeitet werden können, Nachrichten mit fehlerhaften Nutzlasten oder Nachrichten, bei denen Authentifizierungsfehler auftreten, wenn ein Sicherheitsschema auf Nachrichtenebene verwendet wird.
In .NET rufen Sie dazu die ServiceBusReceiver.DeadLetterMessageAsync-Methode auf.
Sie sollten den Typ der Ausnahme in DeadLetterReason
und die Stapelüberwachung der Ausnahme in DeadLetterDescription
einschließen, da dies die Problembehandlung der Ursache des Problems erleichtert, das dazu führt, dass Nachrichten in die Warteschlange für unzustellbare Nachrichten verschoben werden. Beachten Sie, dass dies dazu führen kann, dass einige Nachrichten das Kontingentlimit von 256 KB für die Standardebene von Azure Service Bus überschreiten. Sie können Ihren Service Bus-Namespace von der Standardebene auf die Premium-Dienstebene aktualisieren, um höhere Kontingente und Grenzwerte zu haben.
Unzustellbare Nachrichten in Szenarien mit automatischer Weiterleitung
Nachrichten werden unter folgenden Bedingungen an die Warteschlange für unzustellbare Nachrichten übermittelt:
- Eine Meldung durchläuft mehr als vier Warteschlangen oder Themen, die miteinander verkettet sind.
- Die Zielwarteschlange oder das Zielthema wurde deaktiviert oder gelöscht.
- Die Zielwarteschlange oder das Zielthema überschreitet die maximale Entitätsgröße.
Unzustellbare Nachrichten in „Senden über“-Szenarien
- Wenn die Zielwarteschlange oder das Zielthema deaktiviert ist, wird die Nachricht an die Warteschlange zur Übertragung unzustellbarer Nachrichten (TDLQ, Transfer Dead Letter Queue) der Quellwarteschlange gesendet.
- Wenn die Zielwarteschlange oder Entität die Entitätsgröße überschreitet, wird die Nachricht an eine TDLQ der Quellwarteschlange gesendet.
Senden von unzustellbaren Nachrichten zur erneuten Bearbeitung
Nachdem Sie das Problem, das dazu führte, dass die Nachricht nicht zugestellt werden konnte, behoben haben, können Sie sie erneut an die Warteschlange oder das Thema senden, damit sie erneut verarbeitet wird.
Tools wie Azure Service Bus Explorer ermöglichen manuelles Verschieben von Nachrichten zwischen Warteschlangen und Themen. Wenn viele Nachrichten in der Warteschlange für unzustellbare Nachrichten vorhanden sind, die verschoben werden müssen, kann Code wie dieser dabei helfen, sie alle gleichzeitig zu verschieben. Operator bevorzugen oft eine Benutzeroberfläche, damit sie untersuchen können, welche Nachrichtentypen aus welchen Quellwarteschlangen aus welchen Gründen nicht erfolgreich verarbeitet wurden, während sie gleichzeitig in der Lage sind, Nachrichtenstapel zur erneuten Verarbeitung zu senden. Tools wie ServicePulse mit NServiceBus bieten diese Funktionen.
Zugehöriger Inhalt
Sehen Sie sich unter Aktivieren der Verarbeitung unzustellbarer Nachrichten für eine Warteschlange oder ein Abonnement die verschiedenen Möglichkeiten beim Konfigurieren der Einstellung Verarbeitung unzustellbarer Nachrichten bei Nachrichtenablauf an.