Översikt över köer med obeställbara Service Bus-meddelanden

Azure Service Bus-köer och ämnesprenumerationer tillhandahåller en sekundär underfråga som kallas för en kö med obeställbara bokstäver (DLQ). Kön för obeställbara meddelanden behöver inte uttryckligen skapas och kan inte tas bort eller hanteras oberoende av huvudentiteten.

Den här artikeln beskriver köer med obeställbara meddelanden i Service Bus. Mycket av diskussionen illustreras av exemplet med köer med obeställbara bokstäver på GitHub.

Kön med obeställbara meddelanden

Syftet med kön med obeställbara meddelanden är att lagra meddelanden som inte kan levereras till någon mottagare eller meddelanden som inte kunde bearbetas. Meddelanden kan sedan tas bort från DLQ och inspekteras. Ett program kan med hjälp av en operatör korrigera problem och skicka meddelandet igen, logga det faktum att det uppstod ett fel och vidta korrigerande åtgärder.

Från ett API- och protokollperspektiv liknar DLQ mestadels alla andra köer, förutom att meddelanden endast kan skickas via åtgärden med obeställbara bokstäver för den överordnade entiteten. Dessutom observeras inte time-to-live och du kan inte ta emot ett meddelande från en DLQ. Kön med obeställbara meddelanden har fullt stöd för peek-lock-leverans och transaktionsåtgärder.

Det finns ingen automatisk rensning av kön för obeställbara meddelanden. Meddelanden finns kvar i kön för obeställbara meddelanden tills du uttryckligen hämtar dem och slutför det obeställbara meddelandet.

Antal DLQ-meddelanden

Det går inte att hämta antalet meddelanden i kön med obeställbara meddelanden på ämnesnivå. Det beror på att meddelanden inte finns på ämnesnivå. När en avsändare i stället skickar ett meddelande till ett ämne vidarebefordras meddelandet till prenumerationer för ämnet inom millisekunder och finns därför inte längre på ämnesnivå. Därför kan du se meddelanden i den DLQ som är associerad med prenumerationen för ämnet. I följande exempel visar Service Bus Explorer att det för närvarande finns 62 meddelanden i DLQ för prenumerationen "test1".

Image showing 62 messages in the dead-letter queue.

Du kan också få antalet DLQ-meddelanden med hjälp av Azure CLI-kommandot: az servicebus topic subscription show.

Flytta meddelanden till DLQ

Det finns flera aktiviteter i Service Bus som gör att meddelanden skickas till DLQ från själva meddelandemotorn. Ett program kan också uttryckligen flytta meddelanden till DLQ. Följande två egenskaper (död bokstavsorsak och beskrivning av obeställbara bokstäver) läggs till i meddelanden med obeställbara bokstäver. Program kan definiera sina egna koder för egenskapen dead-letter reason, men systemet anger följande värden.

Orsak till obeställbara bokstäver Beskrivning av fel med obeställbara bokstäver
HeaderSizeExceeded Storlekskvoten för dataströmmen har överskridits.
TTLExpiredException Meddelandet har gått ut och blev obeställbart. Mer information finns i avsnittet Time to live (Tid att leva ).
Sessions-ID är null. Sessionsaktiverad entitet tillåter inte ett meddelande vars sessions-ID är null.
MaxTransferHopCountExceeded Det maximala antalet tillåtna hopp vid vidarebefordran mellan köer har överskridits. Det här värdet är inställt på 4.
MaxDeliveryCountExceeded Det gick inte att använda meddelandet efter maximalt antal leveransförsök. Mer information finns i avsnittet Maximalt antal leveranser .

Maximalt antal leveranser

Det finns en gräns för antalet försök att leverera meddelanden för Service Bus-köer och prenumerationer. Standardvärdet är 10. När ett meddelande har levererats under ett tittlås, men antingen uttryckligen har avbrutits eller om låset har upphört att gälla, ökas leveransantalet för meddelandet. När leveransantalet överskrider gränsen flyttas meddelandet till DLQ. Orsaken till meddelandet i DLQ är inställt på: MaxDeliveryCountExceeded. Det här beteendet kan inte inaktiveras, men du kan ange det maximala leveransantalet till ett stort antal.

Time to live

När du aktiverar obeställbara bokstäver i köer eller prenumerationer flyttas alla meddelanden som upphör att gälla till DLQ. Orsakskoden för obeställbara bokstäver är inställd på: TTLExpiredException.

Uppskjutna meddelanden rensas inte och flyttas till kön med obeställbara meddelanden när de har upphört att gälla. Detta beteende är av design.

Fel vid bearbetning av prenumerationsregler

Om du aktiverar obeställbara undantag för filterutvärdering registreras eventuella fel som inträffar när en prenumerations SQL-filterregel körs i DLQ tillsammans med det felaktiga meddelandet. Använd inte det här alternativet i en produktionsmiljö där inte alla meddelandetyper har prenumeranter.

Obeställbara bokstäver på programnivå

Förutom systembaserade funktioner för obeställbara bokstäver kan program använda DLQ för att uttryckligen avvisa oacceptabla meddelanden. De kan innehålla meddelanden som inte kan bearbetas korrekt på grund av någon form av systemproblem, meddelanden som innehåller felaktiga nyttolaster eller meddelanden som misslyckas med autentisering när något säkerhetsschema på meddelandenivå används.

Detta kan göras genom att anropa metoden ServiceBusReceiver.DeadLetterMessageAsync.

Vi rekommenderar att du inkluderar typen av undantag i DeadLetterReason och stackspårningen av undantaget i DeadLetterDescription eftersom det gör det enklare att felsöka orsaken till problemet, vilket resulterar i att meddelanden blir obeställbara. Tänk på att detta kan leda till att vissa meddelanden överskrider kvotgränsen på 256 KB för standardnivån för Azure Service Bus, vilket ytterligare anger att Premium-nivån är det som ska användas för produktionsmiljöer.

Obeställbara bokstäver i scenarier med automatisk vidarebefordran

Meddelanden skickas till kön med obeställbara meddelanden under följande villkor:

  • Ett meddelande skickas genom fler än fyra köer eller ämnen som är sammanlänkade.
  • Målkön eller ämnet är inaktiverat eller borttaget.
  • Målkön eller ämnet överskrider den maximala entitetsstorleken.

Obeställbara bokstäver i skicka via scenarier

  • Om målkön eller ämnet är inaktiverat skickas meddelandet till en TDLQ-kö (transfer dead letter queue) för källkön.
  • Om målkön eller ämnet tas bort utlöses undantaget 404.
  • Om målkön eller entiteten överskrider entitetsstorleken skickas meddelandet till en TDLQ i källkön.

Sökväg till kön med obeställbara meddelanden

Du kan komma åt kön med obeställbara bokstäver med hjälp av följande syntax:

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

Skicka meddelanden med obeställbara meddelanden som ska bearbetas på nytt

Eftersom det kan finnas värdefulla affärsdata i meddelanden som hamnade i kön med obeställbara meddelanden är det önskvärt att dessa meddelanden bearbetas på nytt när operatörerna har slutfört hanteringen av de omständigheter som gjorde att meddelandena var obeställbara från början.

Verktyg som Azure Service Bus Explorer möjliggör manuell flyttning av meddelanden mellan köer och ämnen. Om det finns många meddelanden i kön med obeställbara meddelanden som behöver flyttas kan kod som den här hjälpa till att flytta dem alla samtidigt. Operatörer föredrar ofta att ha ett användargränssnitt så att de kan felsöka vilka meddelandetyper som har misslyckats med bearbetningen, från vilka källköer och av vilka skäl, samtidigt som de kan skicka om batchar med meddelanden som ska bearbetas på nytt. Verktyg som ServicePulse med NServiceBus tillhandahåller dessa funktioner.

Nästa steg

Se Aktivera obeställbara bokstäver för en kö eller prenumeration för att lära dig mer om olika sätt att konfigurera obeställbara bokstäver i inställningen för meddelandeförfallodatum .