Sdílet prostřednictvím


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.

Snímek obrazovky se stránkou žádosti o podporu na webu 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.

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.