Průvodce odstraňováním potíží s Durable Functions
Durable Functions je rozšíření Azure Functions, které umožňuje vytvářet orchestrace bez serveru pomocí běžného kódu. Další informace o Durable Functions najdete v přehledu Durable Functions.
Tento článek obsahuje průvodce odstraňováním potíží s běžnými scénáři ve Durable Functions aplikacích.
Poznámka
Technici podpory Microsoftu jsou k dispozici, aby vám pomohli s diagnostikou problémů s vaší aplikací. Pokud se vám nedaří problém diagnostikovat pomocí této příručky, můžete vytvořit lístek podpory v okně Nová žádost o podporu v části Podpora a řešení potíží na stránce vaší aplikace funkcí v Azure Portal.
Tip
Při ladění a diagnostice problémů doporučujeme začít tím, že se ujistěte, že vaše aplikace používá nejnovější verzi rozšíření Durable Functions. Používání nejnovější verze ve většině případů omezuje známé problémy, které už nahlásili jiní uživatelé. Pokyny k upgradu verze rozšíření najdete v článku Upgrade verze rozšíření Durable Functions.
Karta Diagnostika a řešení problémů v Azure Portal je užitečným prostředkem ke sledování a diagnostice možných problémů souvisejících s vaší aplikací. Poskytuje také potenciální řešení vašich problémů na základě diagnózy. Další podrobnosti najdete v tématu Diagnostika aplikace Funkcí Azure .
Pokud výše uvedené zdroje nepomohly váš problém vyřešit, následující části obsahují rady pro konkrétní příznaky aplikace:
Orchestrace je zablokovaná ve Pending
stavu
Když spustíte orchestraci, zpráva "start" se zapíše do interní fronty spravované rozšířením Durable a stav orchestrace se nastaví na "Čeká na vyřízení". Jakmile se zpráva orchestrace vyzvedne a úspěšně zpracuje dostupná instance aplikace, stav se změní na Spuštěno (nebo do jiného stavu, který není ve stavu Čekání).
Pomocí následujících kroků můžete řešit potíže s instancemi orchestrace, které zůstávají trvale zablokované ve stavu Čekání na vyřízení.
V trasování architektury úloh Durable Task Framework zkontrolujte upozornění nebo chyby týkající se ovlivněného ID instance orchestrace. Ukázkový dotaz najdete v části Trasování chyb a upozornění.
Zkontrolujte řídicí fronty služby Azure Storage přiřazené k zablokovaným orchestrátoru a zjistěte, jestli stále existuje jeho počáteční zpráva. Další informace o řídicích frontách najdete v dokumentaci k řídicí frontě poskytovatele služby Azure Storage.
Změňte verzi konfigurace platformy vaší aplikace na 64bitovou verzi. Někdy se orchestrace nespustí, protože aplikace nemá dostatek paměti. Přepnutí na 64bitový proces umožňuje aplikaci přidělit větší celkovou paměť. To platí jenom pro plány App Service Basic, Standard, Premium a Elastic Premium. Plány Free ani Consumption nepodporují 64bitové procesy.
Orchestrace se spustí po dlouhém zpoždění
Za normálních okolností se orchestrace spustí během několika sekund po naplánování. V některých případech však může zahájení orchestrace trvat déle. Při řešení potíží se spuštěním orchestrací trvá déle než několik sekund, použijte následující postup.
Projděte si dokumentaci k zpožděným orchestracím ve službě Azure Storage a zkontrolujte, jestli toto zpoždění může být způsobeno známými omezeními.
V trasování architektury úloh Durable Task Framework zkontrolujte upozornění nebo chyby s OVLIVNĚNÝM ID instance orchestrace. Ukázkový dotaz najdete v části Trasování chyb a upozornění.
Orchestrace se nedokončila / je zablokovaná Running
ve stavu
Pokud orchestrace zůstane ve stavu Spuštěno po dlouhou dobu, obvykle to znamená, že čeká na dlouho běžící úlohu, která je naplánovaná na dokončení. Může například čekat na dokončení trvalé úlohy časovače, úkolu aktivity nebo úkolu externí události. Pokud však zjistíte, že naplánované úlohy byly úspěšně dokončeny, ale orchestrace stále nepostupuje, může dojít k problému, který brání orchestraci v pokračování k dalšímu úkolu. Orchestrace v tomto stavu často označujeme jako "zablokované orchestrace".
Při řešení potíží se zablokovanými orchestracemi postupujte následovně:
Zkuste aplikaci funkcí restartovat. Tento krok může pomoct v případě, že se orchestrace zablokuje kvůli přechodné chybě nebo vzájemnému zablokování v aplikaci nebo v kódu rozšíření.
Zkontrolujte fronty řízení účtu služby Azure Storage a zjistěte, jestli se některé fronty neustále rozrůstají. Tento dotaz KQL pro zasílání zpráv ve službě Azure Storage může pomoct identifikovat problémy s vyřazením zpráv orchestrace z fronty. Pokud se problém týká pouze jedné fronty ovládacích prvků, může to znamenat problém, který existuje jenom v konkrétní instanci aplikace. V takovém případě by mohlo pomoct vertikální navýšení nebo snížení kapacity instance virtuálního počítače, která není v pořádku.
Pomocí dotazu Application Insights v části Zasílání zpráv služby Azure Storage vyfiltrujte název této fronty jako ID oddílu a vyhledejte případné problémy související s tímto řízením oddílu fronty.
Projděte si doprovodné materiály v Durable Functions osvědčených postupů a diagnostických nástrojů. Některé problémy můžou být způsobené známými Durable Functions anti-vzory.
Projděte si dokumentaci ke správě verzí Durable Functions. Některé problémy můžou být způsobeny zásadními změnami instancí orchestrace za určitého nasazení.
Orchestrace běží pomalu
Zpracování náročných dat, vnitřní chyby a nedostatek výpočetních prostředků můžou způsobit pomalejší než normální spouštění orchestrací. Při řešení potíží s orchestracemi, které trvají déle, než se čekalo, použijte následující postup:
V trasování architektury úloh Durable Task Framework zkontrolujte upozornění nebo chyby týkající se ovlivněného ID instance orchestrace. Ukázkový dotaz najdete v části Trasování chyb a upozornění.
Pokud vaše aplikace využívá procesní model .NET, zvažte povolení rozšířených relací. Rozšířené relace můžou minimalizovat zatížení historie, což může zpomalit zpracování.
Zkontrolujte kritické body výkonu a škálovatelnosti. Výkon aplikace závisí na mnoha faktorech. Například vysoké využití procesoru nebo velké využití paměti může způsobit zpoždění. Podrobné pokyny najdete v tématu Výkon a škálování Durable Functions.
Ukázkové dotazy
Tato část ukazuje, jak řešit problémy psaním vlastních dotazů KQL v instanci Aplikace Azure Insights nakonfigurované pro vaši aplikaci Azure Functions.
Zasílání zpráv ve službě Azure Storage
Při použití výchozího poskytovatele služby Azure Storage se veškeré Durable Functions chování řídí zprávami fronty služby Azure Storage a všechny stavy související s orchestrací se ukládají v úložišti tabulek a úložišti objektů blob. Pokud je povolené trasování architektury úloh Durable Task Framework, všechny interakce Azure Storage se protokolují do Application Insights a tato data jsou kriticky důležitá pro ladění problémů se spouštěním a výkonem.
Od verze 2.3.0 rozšíření Durable Functions můžete mít tyto protokoly Durable Task Framework publikované do vaší instance Application Insights aktualizací konfigurace protokolování v souboru host.json. Informace a pokyny k tomu najdete v článku Protokolování architektury úloh Durable Task Framework .
Následující dotaz slouží ke kontrole kompletních interakcí se službou Azure Storage pro konkrétní instanci orchestrace. Upravte start
a orchestrationInstanceID
pro filtrování podle časového rozsahu a ID instance.
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
let orchestrationInstanceID = "XXXXXXX"; //edit this
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "DurableTask.AzureStorage"
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"]
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"]
| extend details = customDimensions["prop__Details"]
| extend instanceId = customDimensions["prop__InstanceId"]
| extend messageId = customDimensions["prop__MessageId"]
| extend executionId = customDimensions["prop__ExecutionId"]
| extend age = customDimensions["prop__Age"]
| extend latencyMs = customDimensions["prop__LatencyMs"]
| extend dequeueCount = customDimensions["prop__DequeueCount"]
| extend partitionId = customDimensions["prop__PartitionId"]
| extend eventCount = customDimensions["prop__TotalEventCount"]
| extend taskHub = customDimensions["prop__TaskHub"]
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion
Trasování chyb nebo upozornění
Následující dotaz vyhledá chyby a upozornění pro danou instanci orchestrace. Budete muset zadat hodnotu pro orchestrationInstanceID
.
let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX);
traces
| where timestamp > start and timestamp < start + 1h
| extend instanceId = iif(isnull(customDimensions["prop__InstanceId"] ) , customDimensions["prop__instanceId"], customDimensions["prop__InstanceId"] )
| extend logLevel = customDimensions["LogLevel"]
| extend functionName = customDimensions["prop__functionName"]
| extend status = customDimensions["prop__status"]
| extend details = customDimensions["prop__Details"]
| extend reason = customDimensions["prop__reason"]
| where severityLevel > 1 // to see all logs of severity level "Information" or greater.
| where instanceId == orchestrationInstanceID
| sort by timestamp asc
Řídicí protokoly fronty nebo ID oddílu
Následující dotaz vyhledá všechny aktivity přidružené k řídicí frontě instanceId. V souboru budete muset zadat hodnotu instanceID orchestrationInstanceID
a čas spuštění dotazu v start
.
let orchestrationInstanceID = "XXXXXX"; // edit this
let start = datetime(XXXX-XX-XXTXX:XX:XX); // edit this
traces // determine control queue for this orchestrator
| where timestamp > start and timestamp < start + 1h
| extend instanceId = customDimensions["prop__TargetInstanceId"]
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| where partitionId contains "control"
| where instanceId == orchestrationInstanceID
| join kind = rightsemi(
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "DurableTask.AzureStorage"
| extend taskName = customDimensions["EventName"]
| extend eventType = customDimensions["prop__EventType"]
| extend extendedSession = customDimensions["prop__IsExtendedSession"]
| extend account = customDimensions["prop__Account"]
| extend details = customDimensions["prop__Details"]
| extend instanceId = customDimensions["prop__InstanceId"]
| extend messageId = customDimensions["prop__MessageId"]
| extend executionId = customDimensions["prop__ExecutionId"]
| extend age = customDimensions["prop__Age"]
| extend latencyMs = customDimensions["prop__LatencyMs"]
| extend dequeueCount = customDimensions["prop__DequeueCount"]
| extend partitionId = tostring(customDimensions["prop__PartitionId"])
| extend eventCount = customDimensions["prop__TotalEventCount"]
| extend taskHub = customDimensions["prop__TaskHub"]
| extend pid = customDimensions["ProcessId"]
| extend appName = cloud_RoleName
| extend newEvents = customDimensions["prop__NewEvents"]
) on partitionId
| sort by timestamp asc
| project timestamp, appName, severityLevel, pid, taskName, eventType, message, details, messageId, partitionId, instanceId, executionId, age, latencyMs, dequeueCount, eventCount, newEvents, taskHub, account, extendedSession, sdkVersion
Referenční informace ke sloupcům Application Insights
Níže je seznam sloupců promítaných výše uvedenými dotazy a jejich popisy.
Sloupec | Popis |
---|---|
Pid | ID procesu instance aplikace funkcí To je užitečné, pokud chcete zjistit, jestli se proces recykloval během provádění orchestrace. |
název_úkolu | Název události, která se protokoluje. |
eventType | Typ zprávy, která obvykle představuje práci provedenou orchestrátorem. Úplný seznam možných hodnot a jejich popisy najdete tady. |
extendedSession | Logická hodnota označující, jestli jsou povolené rozšířené relace . |
account | Účet úložiště používaný aplikací. |
Podrobnosti | Další informace o konkrétní události, pokud jsou k dispozici. |
instanceId | ID pro danou instanci orchestrace nebo entity. |
Messageid | Jedinečné ID služby Azure Storage pro danou zprávu fronty. Tato hodnota se nejčastěji zobrazuje v událostech trasování ReceivedMessage, ProcessingMessage a DeletingMessage. Všimněte si, že v událostech SendingMessage není k dispozici, protože ID zprávy vygeneruje Služba Azure Storage po odeslání zprávy. |
executionId | ID spuštění orchestrátoru, které se změní při každém continue-as-new vyvolání. |
věk | Počet milisekund od zařazení zprávy do fronty. Velká čísla často značí problémy s výkonem. Výjimkou je typ zprávy TimerFired, který může mít v závislosti na době trvání časovače velkou hodnotu Age. |
latencyMs | Počet milisekund, které zabrala některá operace úložiště. |
dequeueCount | Kolikrát byla zpráva vyřazena z fronty. Za normálních okolností je tato hodnota vždy 1. Pokud je jich více, může být problém. |
Partitionid | Název fronty přidružené k tomuto protokolu. |
totalEventCount | Počet událostí historie, které jsou součástí aktuální akce. |
taskHub | Název vašeho centra úkolů. |
nové událostí | Čárkami oddělený seznam událostí historie, které se zapisují do tabulky Historie v úložišti. |