Dela via


Ö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 låta en användare korrigera problem och skicka meddelandet igen.

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 stöder helt normala åtgärder, till exempel peek-lock-leverans, mottagning och borttagning 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.

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

I .NET kan du använda FormatDeadLetterPath -metoden.

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

Antal DLQ-meddelanden

Det är inte tillämpligt att hämta antalet meddelanden i kön med obeställbara meddelanden på ämnesnivå eftersom 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".

Bild som visar 62 meddelanden i kön med obeställbara meddelanden.

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 den här strömmen överskred gränsen.
TTLExpiredException Meddelandet har gått ut och blev obeställbart. Mer information finns i avsnittet Time to live (Tid att leva ).
Session ID is 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 överskred gränsen. 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 .

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.

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 levereras under ett tittlås, men antingen uttryckligen överges 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.

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 du har meddelandetyper som skickas till ämnet, som inte har prenumeranter, eftersom detta kan leda till en stor belastning på DLQ-meddelanden. Se därför till att alla meddelanden som skickas till ämnet har minst en matchande prenumeration.

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.

I .NET kan du göra det 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 det kan leda till att vissa meddelanden överskrider kvotgränsen på 256 KB för standardnivån för Azure Service Bus. Du kan uppgradera Service Bus-namnområdet från standardnivån till premiumnivån för att ha högre kvoter och gränser.

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 kön för överföring av obeställbara meddelanden (TDLQ) i källkön.
  • Om målkön eller entiteten överskrider entitetsstorleken skickas meddelandet till en TDLQ i källkön.

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

När du har löst problemet som gjorde att meddelandet blev obeställt kan du skicka det på nytt till kön eller ämnet som ska bearbetas på nytt.

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 misslyckades med bearbetningen, från vilka källköer och av vilka skäl, samtidigt som de fortfarande kan skicka om batchar med meddelanden som ska bearbetas på nytt. Verktyg som ServicePulse med NServiceBus tillhandahåller dessa funktioner.

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 .