Sdílet prostřednictvím


Přehled front nedoručených zpráv ve službě Service Bus

Fronty a odběry témat služby Azure Service Bus poskytují sekundární podknižní frontu označovanou jako fronta nedoručených zpráv (DLQ). Frontu nedoručených zpráv není potřeba explicitně vytvářet a není možné ji odstranit ani spravovat nezávisle na hlavní entitě.

Tento článek popisuje fronty nedoručených zpráv ve službě Service Bus. Velká část diskuze je ilustrovaná ukázkou front dead-letter na GitHubu.

Fronta nedoručených zpráv

Účelem fronty nedoručených zpráv je uchovávat zprávy, které nelze doručovat žádnému příjemci, ani zprávy, které nelze zpracovat. Zprávy se pak dají z DLQ odebrat a zkontrolovat. Aplikace může uživateli umožnit opravit problémy a znovu odeslat zprávu.

Z hlediska rozhraní API a protokolu se DLQ většinou podobá jakékoli jiné frontě, s tím rozdílem, že zprávy lze odesílat pouze prostřednictvím operace nedoručených zpráv nadřazené entity. Kromě toho není pozorovaný čas naživo a zprávu z DLQ nemůžete vyslechnout. Fronta nedoručených zpráv plně podporuje normální operace, jako je doručování zámků, příjem a odstranění a transakční operace.

Fronta nedoručených zpráv se nečistí automaticky. Zprávy zůstanou ve frontě DLQ, dokud je explicitně nenačtete a nedokončíte jejich doručení.

Cesta k frontě nedoručených zpráv

Frontu nedoručených zpráv můžete získat pomocí následující syntaxe:

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

V .NET můžete použít metodu FormatDeadLetterPath .

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

Počet zpráv DLQ

Získání počtu zpráv ve frontě nedoručených zpráv na úrovni tématu se nedá použít, protože zprávy se nenachází na úrovni tématu. Místo toho, když odesílatel odešle zprávu do tématu, zpráva se přepošle odběrům tématu v milisekundách, a proto se už nenachází na úrovni tématu. V knihovně DLQ přidružené k odběru tématu se tedy zobrazují zprávy. V následujícím příkladu Service Bus Explorer ukazuje, že v knihovně DLQ pro odběr "test1" je aktuálně 62 zpráv.

Obrázek znázorňující 62 zpráv ve frontě nedoručených zpráv

Počet zpráv DLQ můžete získat také pomocí příkazu Azure CLI: az servicebus topic subscription show.

Přesouvání zpráv do DLQ

Ve službě Service Bus je několik aktivit, které způsobují, že se zprávy odsílají do knihovny DLQ přímo v samotném modulu pro zasílání zpráv. Aplikace může také explicitně přesouvat zprávy do DLQ. Do nedoručených zpráv se přidají následující dvě vlastnosti (důvod nedoručených zpráv a popis nedoručených zpráv). Aplikace mohou definovat vlastní kódy pro vlastnost důvodu nedoručených písmen, ale systém nastaví následující hodnoty.

Důvod nedoručených dopisů Popis chyby nedoručených zpráv
HeaderSizeExceeded Kvóta velikosti pro tento datový proud překročila limit.
TTLExpiredException Zprávě vypršela platnost a zařadila se do fronty nedoručených zpráv. Podrobnosti najdete v části Time to Live (Čas k živému ).
Session ID is null. Entita povolená relací nepodporuje zprávy, jejichž identifikátor relace má hodnotu null.
MaxTransferHopCountExceeded Maximální počet povolených segmentů směrování při předávání mezi frontami překročil limit. Tato hodnota je nastavená na hodnotu 4.
MaxDeliveryCountExceeded Po maximálním pokusu o doručení se zpráva nepovedlo spotřebovat. Podrobnosti najdete v části Maximální počet doručení.

Hodnota TTL (Time to Live)

Když ve frontách nebo předplatných povolíte nedoručované dopisy, všechny zprávy s vypršením platnosti se přesunou do knihovny DLQ. Kód důvodu nedoručených písmen je nastaven na: TTLExpiredException. Odložené zprávy se po vypršení jejich platnosti nevyprázdní a přesunou se do fronty nedoručených zpráv. Toto chování je záměrné.

Maximální počet doručení

Počet pokusů o doručení zpráv pro fronty a odběry služby Service Bus je omezený. Výchozí hodnota je 10. Kdykoli se zpráva doručí pod zámkem náhledu, ale buď je explicitně opuštěná, nebo vyprší platnost zámku, zvýší se počet doručení zprávy. Pokud počet doručení překročí limit, zpráva se přesune do knihovny DLQ. Důvod nedoručeného dopisu zprávy v DLQ je nastaven na: MaxDeliveryCountExceeded. Toto chování nejde zakázat, ale maximální počet doručení můžete nastavit na velké číslo.

Chyby při zpracování pravidel předplatného

Pokud u výjimek vyhodnocení filtru povolíte nedoručené dopisování, všechny chyby, ke kterým dochází, když se v dlQ spustí pravidlo filtru SQL předplatného, se zachytí spolu se zprávou o přesměrování. Tuto možnost nepoužívejte v produkčním prostředí, kde máte typy zpráv odesílané do tématu, které nemají odběratele, protože to může vést k velkému zatížení zpráv DLQ. Proto se ujistěte, že všechny zprávy odeslané do tématu mají alespoň jedno odpovídající předplatné.

Nedoručení na úrovni aplikace

Kromě funkcí nedoručených zpráv od systému můžou aplikace používat knihovnu DLQ k explicitní odmítnutí nepřijatelných zpráv. Můžou obsahovat zprávy, které se nedají správně zpracovat kvůli nějakému problému se systémem, zprávám, které obsahují poškozené datové části, nebo zprávy, které selžou ověřování při použití nějakého schématu zabezpečení na úrovni zpráv.

V .NET to lze provést voláním ServiceBusReceiver.DeadLetterMessageAsync metoda.

Doporučujeme zahrnout typ výjimky do DeadLetterReason zásobníku a trasování zásobníku výjimky, DeadLetterDescription protože usnadňuje řešení příčin problému, které vede k nedoručitelnosti zpráv. Mějte na paměti, že může vést k překročení limitu kvóty 256 kB pro úroveň Standard služby Azure Service Bus. Obor názvů služby Service Bus můžete upgradovat z úrovně Standard na úroveň Premium, abyste měli vyšší kvóty a limity.

Nedoručované dopisy ve scénářích automatického předávání

Zprávy se odesílají do fronty nedoručených zpráv za následujících podmínek:

  • Zpráva prochází více než čtyřmi frontami nebo tématy, které jsou zřetězenými.
  • Cílová fronta nebo téma je zakázaná nebo odstraněná.
  • Cílová fronta nebo téma překračují maximální velikost entity.

Zasílání nedoručených dopisů prostřednictvím scénářů

  • Pokud je cílová fronta nebo téma zakázané, zpráva se odešle do fronty přenosu nedoručených zpráv (TDLQ) zdrojové fronty.
  • Pokud cílová fronta nebo entita překročí velikost entity, zpráva se odešle do TDLQ zdrojové fronty.

Odesílání nedoručených zpráv, které se mají znovu zpracovat

Jakmile vyřešíte problém, který způsobil nedoručené zprávy, můžete ji znovu odeslat do fronty nebo tématu, aby se znovu zpracovala.

Nástroje, jako je Azure Service Bus Explorer , umožňují ruční přesouvání zpráv mezi frontami a tématy. Pokud je ve frontě s nedoručenou zprávou mnoho zpráv, které je potřeba přesunout, může jim kód podobný tomu pomoct přesunout všechny najednou. Operátoři často dávají přednost uživatelskému rozhraní, aby mohli řešit problémy s typy zpráv, které selhalo zpracování, ze kterých zdrojových front a z jakých důvodů se stále můžou znovu odeslat dávky zpráv, které se mají znovu zpracovat. Tyto funkce poskytují nástroje, jako je ServicePulse s NServiceBus .

Informace o různých způsobech konfigurace nedoručených zpráv v nastavení vypršení platnosti zpráv najdete v tématu Povolení nedoručených zpráv pro frontu nebo odběr.