Výjimky zasílání zpráv služby Service Bus (.NET)
Klientská knihovna Service Bus .NET zobrazí výjimky, když dojde k chybě operace služby nebo klienta. Pokud je to možné, používají se standardní typy výjimek .NET k předávání informací o chybách. Pro scénáře specifické pro Service Bus se vyvolá výjimka ServiceBusException .
Klienti služby Service Bus automaticky opakují výjimky, které jsou považovány za přechodné, podle nakonfigurovaných možností opakování. Při zobrazení výjimky pro aplikaci se buď neúspěšně použily všechny pokusy, nebo byla výjimka považována za netransientní. Další informace o konfiguraci možností opakování najdete v ukázce Přizpůsobení možností opakování.
Výjimka ServiceBusException
Výjimka obsahuje některé kontextové informace, které vám pomůžou porozumět kontextu chyby a její relativní závažnosti.
-
EntityPath
: Identifikuje entitu služby Service Bus, ze které došlo k výjimce, pokud je k dispozici. -
IsTransient
: Určuje, zda je výjimka považována za obnovitelnou. V případě, že byla považována za přechodná, služba Azure Service Bus už použila příslušné zásady opakování a všechny opakování nebyly úspěšné. -
Message
: Poskytuje popis chyby, ke které došlo, a relevantní kontext. -
StackTrace
: Představuje okamžité rámce zásobníku volání a zvýrazní umístění v kódu, kde došlo k chybě. -
InnerException
: Když byla výjimka výsledkem operace služby, často se jedná oMicrosoft.Azure.Amqp.AmqpException
instanci popisující chybu, která následuje po specifikaci AMQP (Oasis Advanced Message Queuing Protocol) 1.0. -
Reason
: Poskytuje sadu známých důvodů selhání, které pomáhají kategorizovat a objasnit původní příčinu. Tyto hodnoty jsou určeny k povolení použití filtrování výjimek a jiné logiky, kde by kontrola textu zprávy výjimky nebyla ideální. Mezi klíčové důvody selhání patří:ServiceTimeout
: Označuje, že služba Service Bus neodpověděla na požadavek na operaci v očekávaném časovém intervalu. Příčinou může být přechodný problém se sítí nebo problém se službou. Služba Service Bus může nebo nemusí být úspěšně dokončena žádost; stav není znám. V kontextu další dostupné relace tato výjimka značí, že v entitě nebyly k dispozici žádné odemknuté relace. Tyto chyby jsou přechodné chyby, které se automaticky opakuje.QuotaExceeded
: Obvykle značí, že pro jednu entitu existuje příliš mnoho aktivních operací příjmu. Chcete-li se této chybě vyhnout, snižte počet potenciálních souběžných příjmu. Dávkové příjem můžete použít k pokusu o příjem více zpráv na žádost o přijetí. Další informace najdete v tématu Kvóty služby Service Bus.MessageSizeExceeded
: Označuje, že velikost zprávy překročila maximální velikost zprávy. Velikost zprávy obsahuje text zprávy a všechna přidružená metadata. Nejlepším řešením této chyby je snížit počet odesílaných zpráv v dávce nebo velikosti textu zprávy, která je součástí zprávy. Vzhledem k tomu, že se omezení velikosti můžou změnit, podívejte se na kvóty služby Service Bus pro konkrétní hodnoty.MessageLockLost
: Označuje, že zámek zprávy je ztracen. Volající by se měli pokusit zprávu znovu přijmout a zpracovat. Tato výjimka platí jenom pro entity, které nepoužívají relace. K této chybě dochází v případě, že zpracování trvá déle, než je doba trvání uzamčení a zámek zprávy se neprodlouží. K této chybě může také dojít, když je propojení odpojeno kvůli přechodnému problému se sítí nebo když je propojení nečinné po dobu 10 minut.Služba Service Bus používá protokol AMQP, který je stavový. Vzhledem k povaze protokolu platí, že pokud je propojení, které připojuje klienta a službu, odpojeno po přijetí zprávy, ale před vyrovnáním zprávy se zpráva nedá vyřešit při opětovném připojení odkazu. Propojení je možné odpojit kvůli krátkodobému přechodnému selhání sítě, výpadku sítě nebo kvůli vypršení 10minutového časového limitu nečinnosti služby. Opětovné připojení odkazu se automaticky provede jako součást jakékoli operace, která vyžaduje propojení, tj. vyrovnání nebo příjem zpráv. Kvůli tomuto chování se můžete setkat
ServiceBusException
sReason
MessageLockLost
dobou vypršení platnosti zámku neboSessionLockLost
i v případě, že čas vypršení platnosti zámku ještě neproběhl.SessionLockLost
: Označuje, že platnost zámku v relaci vypršela. Volající by se měli pokusit relaci znovu přijmout. Tato výjimka se vztahuje pouze na entity s povolenými relacemi. K této chybě dochází v případě, že zpracování trvá déle, než je doba trvání uzamčení a zámek relace se neprodlouží. K této chybě může také dojít, když je propojení odpojeno kvůli přechodnému problému se sítí nebo když je propojení nečinné po dobu 10 minut. Služba Service Bus používá protokol AMQP, který je stavový. Vzhledem k povaze protokolu platí, že pokud je propojení, které připojuje klienta a službu, odpojeno po přijetí zprávy, ale před vyrovnáním zprávy se zpráva nedá vyřešit při opětovném připojení odkazu. Propojení je možné odpojit kvůli krátkodobému přechodnému selhání sítě, výpadku sítě nebo kvůli vypršení 10minutového časového limitu nečinnosti služby. Opětovné připojení odkazu se automaticky provede jako součást jakékoli operace, která vyžaduje propojení, tj. vyrovnání nebo příjem zpráv. Kvůli tomuto chování může dojítServiceBusException
Reason
MessageLockLost
k vypršení platnosti zámku neboSessionLockLost
i v případě, že čas vypršení platnosti zámku ještě neproběhl.MessageNotFound
: K této chybě dochází při pokusu o přijetí odložené zprávy podle pořadového čísla zprávy, která v entitě neexistuje nebo je aktuálně uzamčena.SessionCannotBeLocked
: Označuje, že požadovanou relaci nelze uzamknout, protože zámek je již uložený jinde. Jakmile zámek vyprší, můžete relaci přijmout.GeneralError
: Označuje, že služba Service Bus při zpracování požadavku narazila na chybu. Upgrade a restartování služby často způsobují tuto chybu. Tyto chyby jsou přechodné chyby, které se automaticky opakuje.ServiceCommunicationProblem
: Označuje, že došlo k chybě při komunikaci se službou. Problém může vycházet z přechodného problému se sítí nebo problému se službou. Tyto chyby jsou přechodné chyby, které se budou automaticky opakovat.ServiceBusy
: Označuje, že služba omezila požadavek. Podrobnosti popisující, co může způsobit omezování požadavku a jak se vyhnout omezování, najdete tady. Omezené požadavky se budou opakovat, ale klientská knihovna automaticky použije 10sekundovou zálohu před tím, než se pokusíte o další požadavky používající stejnéServiceBusClient
(nebo jakékoli podtypy vytvořené z daného klienta). Může to způsobit problémy v případě, že doba trvání uzamčení entity je kratší než 10 sekund, protože zprávy nebo zámky relací budou pravděpodobně ztraceny pro všechny nenasazené zprávy nebo uzamčené relace. Vzhledem k tomu, že omezené požadavky se úspěšně opakují, generované výjimky by se protokolovaly jako upozornění, nikoli jako chyby – konkrétní událost zdroje událostí na úrovni upozornění je 43 (Při spuštění došlo k výjimce a opakování dojde.)MessagingEntityAlreadyExists
: Označuje, že entita se stejným názvem existuje ve stejném oboru názvů.MessagingEntityDisabled
: Entita zasílání zpráv je zakázaná. Znovu povolte entitu pomocí portálu.MessagingEntityNotFound
: Služba Service Bus nemůže najít prostředek služby Service Bus.
Zpracování serviceBusException – příklad
Tady je příklad, jak zpracovat ServiceBusException
a filtrovat podle Reason
.
try
{
// Receive messages using the receiver client
}
catch (ServiceBusException ex) when
(ex.Reason == ServiceBusFailureReason.ServiceTimeout)
{
// Take action based on a service time out
}
Další běžné výjimky
-
ArgumentException
: Klient vyvolá tuto výjimku odvozenou zArgumentException
toho, kdy parametr zadaný při interakci s klientem je neplatný. Informace o konkrétním parametru a povaze problému naleznete v tématuMessage
. -
InvalidOperationException
: Nastane při pokusu o provedení operace, která není platná pro aktuální konfiguraci. K této výjimce obvykle dochází v případě, že klient nebyl nakonfigurován pro podporu operace. Často je možné ji zmírnit úpravou možností předaných klientovi. -
NotSupportedException
: Nastane, když je požadovaná operace platná pro klienta, ale není podporována jeho aktuálním stavem. Informace o scénáři naleznete v saděMessage
. -
AggregateException
: Nastane, když operace může narazit na více výjimek a je zobrazit jako jedna chyba. K této výjimce nejčastěji dochází při spuštění nebo zastavení procesoru služby Service Bus nebo procesoru relace služby Service Bus.
Důvod: QuotaExceeded
Výjimka ServiceBusException s důvodem nastaveným na QuotaExceeded
indikaci, že došlo k překročení kvóty pro konkrétní entitu.
Poznámka:
Kvóty služby Service Bus najdete v tématu Kvóty.
Fronty a témata
U front a témat se často jedná o velikost fronty. Vlastnost chybové zprávy obsahuje další podrobnosti, jak je znázorněno v následujícím příkladu:
Message: The maximum entity size has been reached or exceeded for Topic: 'xxx-xxx-xxx'.
Size of entity in bytes:1073742326, Max entity size in bytes:
1073741824..TrackingId:xxxxxxxxxxxxxxxxxxxxxxxxxx, TimeStamp:3/15/2013 7:50:18 AM
Zpráva uvádí, že téma překročilo limit velikosti, v tomto případě 1 GB (výchozí limit velikosti).
Obory názvů
U oborů názvů může výjimka QuotaExceeded znamenat, že aplikace překročila maximální počet připojení k oboru názvů. Příklad:
<tracking-id-guid>_G12 --->
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]:
ConnectionsQuotaExceeded for namespace xxx.
Běžné příčiny
Existují dvě běžné příčiny této chyby: fronta nedoručených zpráv a nefunkční příjemce zpráv.
Fronta nedoručených zpráv Čtenář nedokončí zprávy a při vypršení platnosti zámku se zprávy vrátí do fronty nebo tématu. K tomu může dojít v případě, že čtenář narazí na výjimku, která mu brání v dokončení zprávy. Po přečtení zprávy 10krát se ve výchozím nastavení přesune do fronty nedoručených zpráv. Vlastnost MaxDeliveryCount řídí toto chování, které má výchozí hodnotu 10. Když se zprávy hromadí ve frontě mrtvých dopisů, zabírají místo.
Pokud chcete tento problém vyřešit, přečtěte si a dokončete zprávy z fronty nedoručených zpráv stejně jako z jakékoli jiné fronty.
Přijímač se zastavil. Příjemce přestal přijímat zprávy z fronty nebo odběru. Způsob identifikace problému spočívá v tom, že se podíváte na počet aktivních zpráv. Pokud je počet aktivních zpráv vysoký nebo rostoucí, nebudou se zprávy číst tak rychle, jak se zapisují.
Důvod: MessageLockLost
Příčina
Výjimka ServiceBusException s důvodem nastaveným na MessageLockLost
indikaci, že zpráva je přijata pomocí režimu přijetí PeekLock a zámek uchovávaný klientem vyprší na straně služby.
Zámek zprávy může vypršet z různých důvodů:
- Vypršela platnost časovače zámku, než ho klientská aplikace obnovila.
- Klientská aplikace získala zámek, uložila ho do trvalého úložiště a pak se restartovala. Po restartování se klientská aplikace podívala na příchozí zprávy a pokusila se zprávy dokončit.
Tuto výjimku můžete obdržet také v následujících scénářích:
- Aktualizace služby
- Aktualizace operačního systému
- Změna vlastností entity (fronta, téma, předplatné) při podržení zámku
Rozlišení
Když klientská aplikace obdrží zprávu MessageLockLostException, už ji nemůže zpracovat. Klientská aplikace může volitelně zvážit protokolování výjimky pro analýzu, ale klient musí zprávu odstranit.
Vzhledem k tomu, že vypršela platnost zámku zprávy, vrátila by se zpět do fronty (nebo předplatného) a může ji zpracovat další klientská aplikace, která volá.
Pokud je překročen MaxDeliveryCount, může být zpráva přesunuta do DeadLetterQueue.
Důvod: SessionLockLost
Příčina
Výjimka ServiceBusException s důvodem nastaveným na MessageLockLost
je vyvolána při přijetí relace a zámek uložený klientem vyprší na straně služby.
Zámek relace může vypršet z různých důvodů:
- Vypršela platnost časovače uzamčení, než ji klientská aplikace obnovila.
- Klientská aplikace získala zámek, uložila ho do trvalého úložiště a pak se restartovala. Po restartování se klientská aplikace podívala na příchozí relace a pokusila se zpracovat zprávy v těchto relacích.
Tuto výjimku můžete obdržet také v následujících scénářích:
- Aktualizace služby
- Aktualizace operačního systému
- Změna vlastností entity (fronta, téma, předplatné) při podržení zámku
Rozlišení
Když klientská aplikace obdrží SessionLockLostException, nemůže již zpracovávat zprávy v relaci. Klientská aplikace může zvážit protokolování výjimky pro analýzu, ale klient musí zprávu odstranit.
Vzhledem k tomu, že platnost zámku relace vypršela, vrátila by se zpět do fronty (nebo předplatného) a může ji uzamknout další klientská aplikace, která tuto relaci přijme. Vzhledem k tomu, že zámek relace je uchován jednou klientskou aplikací v daném okamžiku, je zaručeno zpracování v daném pořadí.
TimeoutException
Výjimka TimeoutException značí, že operace iniciovaná uživatelem trvá déle, než vypršel časový limit operace.
Měli byste zkontrolovat hodnotu ServicePointManager.DefaultConnectionLimit vlastnost, protože dosažení tohoto limitu může také způsobit TimeoutException.
Očekává se, že k vypršení časového limitu dojde během operací údržby nebo mezi operacemi údržby, jako jsou aktualizace služby Service Bus (nebo) aktualizace operačního systému u prostředků, které službu spouští. Během aktualizací operačního systému se entity přesunou a uzly se aktualizují nebo restartují, což může způsobit vypršení časového limitu. Podrobnosti o smlouvě o úrovni služeb (SLA) pro službu Service Bus viz Smlouva SLA pro službu Service Bus.
SocketException
Příčina
SocketException je vyvolán v následujících případech:
- Když pokus o připojení selže, protože hostitel po zadané době správně neodpověděl (kód chyby TCP 10060).
- Navázané připojení se nezdařilo, protože se nepodařilo odpovědět připojenému hostiteli.
- Při zpracování zprávy došlo k chybě nebo vzdálený hostitel překročil časový limit.
- Problém s podkladovým síťovým prostředkem
Rozlišení
Chyby SocketException označují, že virtuální počítač hostující aplikace nemůže převést název <mynamespace>.servicebus.windows.net
na odpovídající IP adresu.
Zkontrolujte, jestli se následující příkaz úspěšně namapuje na IP adresu.
PS C:\> nslookup <mynamespace>.servicebus.windows.net
Který by měl poskytovat výstup jako:
Name: <cloudappinstance>.cloudapp.net
Address: XX.XX.XXX.240
Aliases: <mynamespace>.servicebus.windows.net
Pokud se název nepřeloží na IP adresu a alias oboru názvů, obraťte se na správce sítě a prověřte to podrobněji. Překlad názvů se provádí prostřednictvím serveru DNS, který obvykle představuje prostředek v síti zákazníka. Pokud překlad DNS provádí Azure DNS, kontaktujte podpora Azure.
Pokud překlad adres IP funguje podle očekávání, zkontrolujte, jestli je tady povolené připojení ke službě Azure Service Bus.
UnauthorizedAccessException
NeautorizovánoAccessException znamená, že zadané přihlašovací údaje neumožňují provedení požadované akce. Vlastnost Message
obsahuje podrobnosti o selhání.
Doporučujeme postupovat podle těchto ověřovacích kroků v závislosti na typu autorizace poskytnuté při vytváření ServiceBusClient
.
- Ověřte správnost připojovací řetězec.
- Ověřte, že se token SAS vygeneroval správně.
- Ověřte, že byly uděleny správné role řízení přístupu na základě role (RBAC).
Výjimky geografické replikace
ServerBusyException
Příčiny
- Během asynchronní replikace (prodleva replikace větší než nula) se klient pokusí provést operaci u entity služby Service Bus (fronta, téma) nebo provede operaci správy, ale operaci nelze dokončit, protože prodleva replikace mezi primárními a sekundárními oblastmi překročila maximální povolenou prodlevu replikace v sekundách.
- Příklad: Operace je omezena, protože s ní nová prodleva replikace dosáhne 38 323 sekund, což je větší než maximální prodleva replikace nastavená (300 sekund). Aktuální prodleva replikace pro poslední replikovanou operaci je 0 sekund.
- Fronta replikace pro entitu překračuje maximální velikost v bajtech. Maximální velikost v bajtech pro frontu replikace je interní limit nastavený službou Service Bus.
- Příklad: Velikost fronty replikace 73128000 překročila prahovou hodnotu 67108864.
- Při synchronní replikaci vyprší časový limit požadavku při čekání na replikaci jiného požadavku.
-
Příklad: Velký objem požadavků z klientské aplikace pro
<NAMESPACE>/<ENTITYNAME>
. Probíhá replikace do jiných oblastí.
-
Příklad: Velký objem požadavků z klientské aplikace pro
Rozlišení
- Klient by se měl vrátit zpět, aby služba zpracovávala danou úlohu, a pak by se měl klient opakovat.
Vypršení časového limitu
Příčina
- Výjimka vypršení časového limitu v geografickém zotavení po havárii znamená, že se operace nedokončila v rámci časového limitu poskytnutého klienta.
- V synchronní replikaci se primární oblast operace zapisují a replikují do sekundárních oblastí v rozsahu časového limitu operace.
- Při asynchronní replikaci je zápis primární oblasti operace v rozsahu vypršení časového limitu operace, ale replikace operace do sekundárních oblastí není v rozsahu časového limitu operace.
-
Příklad: Operace nebyla dokončena v přiděleném čase 00:01:00 pro zprávu objektu. (
ServiceTimeout
).
Rozlišení
- Klient by měl operaci zopakovat.
- Některé kroky operace vypršení časového limitu mohly být dokončeny. Je možné, že byla operace časového limitu zapsána do primární oblasti a některých sekundárních oblastí. Pokud byla operace zapsána do primární oblasti, nakonec se replikuje do všech sekundárních oblastí bez ohledu na vypršení časového limitu klienta.
BadRequest
Příčina
- Během plánovaného převzetí služeb při selhání je primární oblast dočasně nastavená jako jen pro čtení, aby sekundární oblast mohla dohnat. Pokud se klient pokusí o operaci zápisu do primární oblasti v tomto dočasném stavu jen pro čtení, klient obdrží výjimku BadRequest.
- Příklad: Probíhající přepnutí role replikace, primární replika:<název> entity je Jen pro čtení.
Rozlišení
- Klient musí počkat na dokončení plánovaného převzetí služeb při selhání, aby operace zápisu proběhly úspěšně.
- V případě, že plánované převzetí služeb při selhání trvá příliš dlouho, je možné místo toho aktivovat vynucené převzetí služeb při selhání.
Další kroky
Kompletní referenční informace k rozhraní .NET API služby Service Bus najdete v referenčních informacích k rozhraní AZURE .NET API. Tipy pro řešení potíží najdete v průvodci odstraňováním potíží.