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 pomocí operátoru opravit problémy a znovu odeslat zprávu, protokolovat skutečnost, že došlo k chybě, a provést nápravnou akci.

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 doručování zpráv 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í.

Počet zpráv DLQ

Počet zpráv ve frontě nedoručených zpráv není možné získat na úrovni tématu. Je to proto, že zprávy nejsou 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.

Image showing 62 messages in the dead-letter queue.

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 byla překročena.
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 ).
ID relace má hodnotu null. Entita povolená relací nepodporuje zprávy, jejichž identifikátor relace má hodnotu null.
MaxTransferHopCountExceeded Byl překročen maximální počet povolených segmentů směrování při předávání mezi frontami. 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í.

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ď byla explicitně opuštěná, nebo vypršela 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.

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é.

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í, ve kterém nemají všichni typy zpráv odběratele.

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.

To lze provést voláním metody ServiceBusReceiver.DeadLetterMessageAsync.

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 to může vést k překročení limitu kvóty 256 kB pro úroveň Standard služby Azure Service Bus, což dále znamená, že úroveň Premium je to, co by se mělo použít pro produkční prostředí.

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 je odstraněna cílová fronta nebo téma, vyvolá se výjimka 404.
  • Pokud cílová fronta nebo entita překročí velikost entity, zpráva se odešle do TDLQ zdrojové fronty.

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

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

Vzhledem k tomu, že ve zprávách, které skončily ve frontě nedoručených zpráv, mohou být cenné obchodní data, je žádoucí, aby se tyto zprávy znovu zpracovaly, když operátory dokončily práci s okolnostmi, které způsobily, že zprávy byly na prvním místě nedoručené.

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 potíže s neúspěšným zpracováním typů zpráv, ze kterých zdrojových front a z jakých důvodů je možné znovu odeslat dávky zpráv, které se mají znovu zpracovat. Tyto funkce poskytují nástroje, jako je ServicePulse s NServiceBus .

Další kroky

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.