Sdílet prostřednictvím


Průvodce odstraňováním potíží se službou Durable Functions

Durable Functions je rozšíření Azure Functions , které umožňuje vytvářet bezserverové orchestrace pomocí běžného kódu. Další informace o Durable Functions naleznete v přehledu Durable Functions.

Tento článek obsahuje průvodce odstraňováním běžných problémů v aplikacích Durable Functions.

Poznámka:

Technici podpory Microsoftu můžou pomoct s diagnostikou problémů s vaší aplikací. Pokud se vám nedaří diagnostikovat váš problém pomocí této příručky, můžete vytvořit lístek podpory tak, že v části Podpora a řešení potíží na stránce aplikace funkcí na webu Azure Portal přejdete do okna Nová žádost o podporu a řešení potíží.

Snímek obrazovky se stránkou žádosti o podporu na webu Azure Portal

Návod

Při ladění a diagnostice problémů se doporučuje začít tím, že zajistíte, aby vaše aplikace používala nejnovější verzi rozšíření Durable Functions. Ve většině případů se při použití nejnovější verze zmírňují známé problémy, které už nahlásili jiní uživatelé. Přečtěte si článek Upgrade Durable Functions extension version pro instrukce, jak upgradovat verzi vašeho rozšíření.

Karta Diagnostika a řešení problémů na webu Azure Portal je užitečný prostředek pro monitorování a diagnostiku možných problémů souvisejících s vaší aplikací. Poskytuje také potenciální řešení vašich problémů na základě diagnostiky. Další podrobnosti najdete v diagnostice aplikace Funkcí Azure .

Pokud výše uvedené prostředky váš problém nevyřeší, následující části poskytují rady pro konkrétní příznaky aplikace:

Orchestrace je zablokovaná ve Pending stavu

Když spustíte orchestraci, do interní fronty spravované rozšířením Durable se zapíše startovací zpráva a stav orchestrace se nastaví na "Ve stavu čekání". Po převzetí a úspěšném zpracování zprávy orchestrace dostupnou instancí aplikace se stav změní na "Spuštěno" (nebo do jiného stavu než "Čeká na vyřízení").

Následující postup použijte k řešení potíží s instancemi orchestrace, které zůstávají trvale zablokované ve stavu Čeká na vyřízení.

  • Zkontrolujte logy Durable Task Framework pro upozornění nebo chyby ovlivněného ID instance orchestrace. Ukázkový dotaz najdete v části Chyby/Upozornění trasování.

  • Zkontrolujte fronty ovládacích prvků Azure Storage přiřazené zablokovanému orchestrátoru a zjistěte, zda je jeho počáteční zpráva stále přítomna. Další informace o frontách řízení najdete v dokumentaci k frontám ovládacích prvků poskytovatele Azure Storage.

  • Změňte verzi konfigurace platformy vaší aplikace na 64bitovou verzi. Orchestrace se někdy nespustí, protože aplikaci dochází paměť. 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 nebo Consumption nepodporují 64bitové procesy.

Orchestrace se spustí po dlouhém zpoždění.

Orchestrace se obvykle spustí během několika sekund po naplánování. Existují však určité případy, kdy může zahájení orchestrací trvat déle. Použijte následující kroky k odstraňování potíží, když orchestracím trvá více než několik sekund, než začnou běžet.

Orchestrace se nedokončí / je zablokovaná ve Running stavu

Pokud orchestrace zůstává ve stavu „Spuštěno“ po dlouhou dobu, obvykle to znamená, že čeká na dlouho běžící úlohu, která je naplánovaná dokončit. Může například čekat na úkol časovače s trvalou platností, úkol aktivity nebo úkol týkající se externí události, který se má dokončit. Pokud však zjistíte, že naplánované úlohy byly úspěšně dokončeny, ale orchestrace stále neprobíhá, může dojít k potížím, které brání orchestraci pokračovat k dalšímu úkolu. Orchestrace v tomto stavu se často označují jako "zablokované orchestrace".

Při řešení potíží se zablokovanými orchestracemi postupujte následovně:

  • Zkuste restartovat funkční aplikaci. Tento krok může pomoct, pokud se orchestrace zablokuje kvůli přechodné chybě nebo zablokování v aplikaci nebo v kódu rozšíření.

  • Zkontrolujte fronty řízení účtu Služby Azure Storage a zjistěte, jestli některé fronty neustále rostou. Tento dotaz KQL pro zpracování zpráv ve službě Azure Storage může pomoci identifikovat problémy s odebíráním orchestracních zpráv. Pokud se problém týká pouze jedné řídicí fronty, může to znamenat problém, který existuje jenom u konkrétní instance aplikace, v takovém případě může pomoct škálování nahoru nebo dolů, aby se instance přesunula mimo nestabilní virtuální počítač.

  • 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 všechny problémy související s tímto řídicím oddílem fronty.

  • Projděte si pokyny v osvědčených postupech a diagnostických nástrojích Durable Functions. Některé problémy mohou být způsobené známými nesprávnými vzory Durable Functions.

  • Projděte si dokumentaci k správě verzí Durable Functions. Některé problémy můžou být způsobené zásadními změnami instancí orchestrace v testovacích verzích.

Orchestrace běží pomalu

Těžké zpracování dat, vnitřní chyby a nedostatečné výpočetní prostředky můžou způsobit pomalejší provádění orchestrací než obvykle. Postupujte podle následujících kroků k řešení problémů s orchestracemi, které trvají déle, než se očekávalo:

  • Zkontrolujte protokoly Durable Task Framework pro upozornění nebo chyby u ovlivněného ID instance orchestrace. Ukázkový dotaz najdete v části Chyby/Upozornění trasování.

  • Pokud vaše aplikace využívá procesní model .NET, zvažte povolení rozšířených relací. Rozšířené relace mohou minimalizovat načítání 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 vést ke zpoždění. Podrobné pokyny najdete v článku Výkon a škálování v Durable Functions .

Ukázkové dotazy

Tato část ukazuje, jak řešit problémy napsáním vlastních dotazů KQL v instanci Azure Application Insights nakonfigurované pro vaši aplikaci Azure Functions.

Zprávy v Azure Storage

Při použití výchozího poskytovatele služby Azure Storage se veškeré chování Durable Functions řídí zprávami fronty služby Azure Storage a veškerý stav související s orchestrací se uloží v úložišti tabulek a úložišti objektů blob. Pokud je povolené trasování architektury úloh Durable Task Framework, zaprotokolují se do Application Insights všechny interakce služby Azure Storage a tato data jsou kriticky důležitá pro ladění problémů se spouštěním a výkonem.

Počínaje verzí 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 tomuto postupu najdete v článku protokolování architektury Durable Task Framework .

Následující dotaz slouží ke kontrole kompletních interakcí azure Storage pro konkrétní instanci orchestrace. Upravte start a orchestrationInstanceID vyfiltrujte 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

Sledování chyb/varová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í fronta a protokoly ID oddílu

Následující dotaz vyhledá všechny aktivity přidružené k řídicí frontě instanceId. Budete muset zadat hodnotu pro instanceID v orchestrationInstanceID a počáteční čas 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 sloupci Application Insights

Níže je seznam sloupců promítaných výše uvedenými dotazy a jejich příslušnými popisy.

Sloupec Popis
PID ID procesu instance funkční aplikace To je užitečné při určování, jestli byl proces recyklován během provádění orchestrace.
název úkolu Název zaprotokolované události.
typ události Typ zprávy, která obvykle představuje práci prováděnou orchestrátorem. Tady je úplný seznam možných hodnot a jejich popisů.
extendedSession Logická hodnota označující, jestli jsou povolené rozšířené relace .
účet Úč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.
ID zprávy 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 SendMessage není k dispozici, protože ID zprávy je generováno službou Azure Storage po odeslání zprávy.
executionId ID provádění orchestrátoru, které se mění při každém continue-as-new vyvolání.
věk Počet milisekund od doby zařazení zprávy do fronty. Velká čísla často označují problémy s výkonem. Výjimkou je typ zprávy TimerFired, který může mít velkou hodnotu Stáří v závislosti na době trvání časovače.
latence ms Počet milisekund pořízených určitou operací úložiště.
dequeueCount Počet kolikrát byla zpráva vyjmuta z fronty Za normálních okolností je tato hodnota vždy 1. Pokud je to více než jedna, může dojít k problému.
identifikátor oddílu Název fronty přidružené k tomuto protokolu.
celkovýPočetUdálostí Počet událostí historie, které jsou součástí aktuální akce.
centrum úkolů Název centra úloh.
novéUdálosti Čárkami oddělený seznam událostí historie, které se zapisují do tabulky Historie v úložišti.