Gids voor het oplossen van problemen met Durable Functions

Dit artikel helpt u bij het oplossen van veelvoorkomende scenario's in Durable Functions-apps. Zoek uw symptoom in de volgende lijst en volg de gekoppelde stappen om het probleem vast te stellen en op te lossen.

Veelvoorkomende symptomen

Zie voor KQL-diagnostische queries die u kunt uitvoeren in Application Insights Voorbeeld KQL-queries voor diagnostiek van Durable Functions.

Orchestratie is vastgelopen in de Pending toestand

Wanneer u een orkestratie start, wordt een 'start'-bericht geschreven naar een interne wachtrij die wordt beheerd door de Durable-extensie, en wordt de status van de orkestratie ingesteld op "In behandeling." Nadat een beschikbaar app-exemplaar het orkestratiebericht heeft opgehaald en succesvol heeft verwerkt, verandert de status naar "Actief" (of naar een andere status die niet "In behandeling" is).

Volg deze stappen om problemen met orkestratie-instanties op te lossen die voor onbepaalde tijd vastzitten in de status "In behandeling".

  1. Controleer de Durable Task Framework-traceringen op waarschuwingen of fouten voor de betreffende orchestratie-instantie-ID. Gebruik de query voor fouten en waarschuwingen traceren in Application Insights om te zoeken naar fouten met betrekking tot uw instantie.

  2. Controleer de Azure Storage beheerswachtrijen om te zien of het 'startbericht' van de orkestratie zich nog steeds in de wachtrij bevindt. Navigeer in de Azure-portal naar uw opslagaccount, selecteer Queues en zoek naar wachtrijen met een control voorvoegsel. Zie de documentatie voor de Azure Storage provider controlewachtrij voor informatie over hoe besturingswachtrijen werken.

  3. Wijzig de platformconfiguratie van uw app in 64-bits. Orchestrations kunnen soms niet worden gestart omdat de app zonder geheugen komt te zitten. Als u overschakelt naar een 64-bits proces, kan de app meer geheugen toewijzen. Deze wijziging is alleen van toepassing op App Service Basic-, Standard-, Premium- en Elastic Premium-abonnementen. Gratis of Verbruiksabonnementen bieden geen ondersteuning voor 64-bits processen.

Orchestraties starten na een lange vertraging

Meestal beginnen orkestraties binnen een paar seconden nadat ze zijn gepland. Het kan echter langer duren voordat orkestraties in bepaalde gevallen starten. Volg deze stappen om problemen op te lossen wanneer het meer dan een paar seconden duurt voordat orchestraties beginnen met uitvoeren.

  1. Controleer of de vertraging overeenkomt met een kennisbeperking van de Azure Storage-provider, zoals herverdeling van partities of polling-intervallen op basis van een timer.

  2. Controleer de Durable Task Framework-traceringen op waarschuwingen of fouten met de betrokken ID van de orkestratie-instantie. Gebruik de query Trace-fouten en waarschuwingen in Application Insights om te zoeken naar fouten gerelateerd aan uw instantie.

Orchestratie is vastgelopen in de Running toestand

Als in de orkestratiestatus "Wordt uitgevoerd" langer wordt weergegeven dan verwacht, of als deze lijkt te zijn gestopt met het maken van voortgang, wacht de orkestratie waarschijnlijk op een taak die niet is voltooid. Het kan bijvoorbeeld wachten op een duurzame timer, een activiteitstaak of een externe gebeurtenis. Als geplande taken zijn voltooid, maar de orkestratie nog steeds niet verder gaat, is er mogelijk een probleem waardoor het zijn volgende stap niet kan maken. Indelingen in deze status worden vaak 'vastgelopen orkestraties' genoemd.

Volg deze stappen om problemen met vastgelopen orkestraties op te lossen:

  1. Start de functie-app opnieuw op. Deze stap kan helpen als de orkestratie vastloopt vanwege een tijdelijke fout of deadlock in de app of de extensiecode.

  2. Controleer de Azure Storage controlewachtrijen om te zien of wachtrijen continu groeien. Gebruik de Azure Storage messaging query in Application Insights om problemen met het ophoesten van orkestratieberichten te identificeren. Als het probleem slechts één controlewachtrij beïnvloedt, kan dit duiden op een probleem in een specifieke applicatie-instantie. In dat geval kan het helpen om op of af te schalen om van het ongezonde VM-exemplaar af te komen.

  3. Filter de Azure Storage messaging-query resultaten op basis van de naam van de wachtrij als partitie-id om te zoeken naar problemen met betrekking tot die specifieke besturingselementwachtrijpartitie.

  4. Raadpleeg de documentatie Durable Functions Versioning. Wijzigingen die fouten veroorzaken in actieve orkestratie-instanties, kunnen vastgelopen orkestraties veroorzaken.

Orchestratie duurt langer dan verwacht om te voltooien

Zware gegevensverwerking, interne fouten en onvoldoende rekenkracht kunnen ertoe leiden dat orkestraties langzamer worden uitgevoerd dan normaal. Volg deze stappen om problemen met orkestraties aan te pakken die langer duren dan verwacht om te voltooien:

  1. Controleer de Durable Task Framework-traceringen op waarschuwingen of fouten voor de getroffen instantie-ID van de orkestratie. Gebruik de query voor Traceer fouten en waarschuwingen in Application Insights om te zoeken naar fouten voor uw instantie.

  2. Als uw app gebruikmaakt van het .NET in-process model, kunt u overwegen om extended sessies in te schakelen. Uitgebreide sessies minimaliseren geschiedenisbelastingen, waardoor de verwerking kan worden vertraagd.

  3. Controleer op knelpunten voor prestaties en schaalbaarheid. Hoog CPU-gebruik of een groot geheugenverbruik kan vertragingen veroorzaken. Zie Prestaties en schalen in Durable Functions voor gedetailleerde richtlijnen.

Voorbeelden van KQL-queries voor Durable Functions diagnostiek.

Los problemen op door aangepaste KQL-query's te schrijven in het Azure-toepassing Insights-exemplaar dat is geconfigureerd voor uw Azure Functions-app. Zie de kolomreferentie voor kolomdefinities die in deze query's worden gebruikt.

Azure Storage-berichtenverkeer

Wanneer u de standaardprovider voor Azure Storage gebruikt, wordt alle Durable Functions gedrag aangestuurd door Azure Storage wachtrijberichten en worden alle statussen met betrekking tot een indeling opgeslagen in tabelopslag en blobopslag. Wanneer u Tracering van Durable Task Framework inschakelt, worden alle Azure Storage interacties vastgelegd in Application Insights. Deze gegevens zijn van cruciaal belang voor het opsporen van fouten in de uitvoering en prestatieproblemen.

Vanaf v2.3.0 van de extensie Durable Functions kunt u deze Durable Task Framework-logboeken publiceren naar uw Application Insights-exemplaar door uw logboekconfiguratie bij te werken in het bestand host.json. Zie het artikel Over logboekregistratie van Durable Task Framework voor meer informatie.

De volgende query inspecteert end-to-end Azure Storage communicatie voor een specifieke orkestratie-instantie. Bewerk start en orchestrationInstanceID om te filteren op tijdsbereik en Exemplaar-ID.

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

Fouten en waarschuwingen traceren

De volgende query zoekt naar fouten en waarschuwingen voor een bepaalde orchestratie-instantie. Geef een waarde op voor 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 

Wachtrij- en partitie-ID-logboeken controleren

Met de volgende query wordt gezocht naar alle activiteiten die geassocieerd zijn met de controlewachtrij van een instance-id. Geef de waarde op voor de instanceID in orchestrationInstanceID en de begintijd van de query in 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

Naslaginformatie over kolommen van Application Insights voor queries van Durable Functions

De volgende tabel bevat de kolommen die zijn geprojecteerd door de voorgaande query's en de bijbehorende beschrijvingen.

Column Beschrijving
pid Proces-ID van het exemplaar van de functieapp. Deze waarde is handig om te controleren of het proces is gerecycled tijdens het uitvoeren van een orkestratie.
taakNaam De naam van de gebeurtenis die wordt geregistreerd.
eventType Het type bericht, dat meestal werk vertegenwoordigt dat wordt uitgevoerd door een orchestrator. Zie EventType.cs voor een volledige lijst met mogelijke waarden en beschrijvingen.
verlengde sessie Booleaanse waarde die aangeeft of uitgebreide sessies zijn ingeschakeld.
account Het opslagaccount dat door de app wordt gebruikt.
details Aanvullende informatie over een bepaalde gebeurtenis, indien beschikbaar.
instanceId De ID voor een gegeven orkestratie of entiteit.
bericht-ID De unieke Azure Storage-id voor een bepaald wachtrijbericht. Deze waarde wordt meestal weergegeven in de traceergebeurtenissen ReceivedMessage, ProcessingMessage en DeletingMessage. Deze waarde is niet aanwezig in SendingMessage-gebeurtenissen omdat de bericht-id wordt gegenereerd door Azure Storage na het bericht wordt verzonden.
uitvoeringsId De ID van de orchestrator-uitvoering, die verandert telkens wanneer continue-as-new wordt aangeroepen.
leeftijd Het aantal milliseconden sinds een bericht in de wachtrij is geplaatst. Grote getallen geven vaak prestatieproblemen aan. Een uitzondering is het type TimerFired-bericht, dat mogelijk een grote leeftijdswaarde heeft, afhankelijk van de duur van de timer.
latencyMs Het aantal milliseconden dat door een opslagbewerking wordt genomen.
dequeueCount Het aantal keren dat een bericht uit de wachtrij wordt gehaald. Onder normale omstandigheden is deze waarde altijd 1. Als het meer dan één is, kan er een probleem zijn.
partitionId De naam van de wachtrij die aan dit logboek is gekoppeld.
totaalaantalGebeurtenissen Het aantal geschiedenisevenementen dat betrokken is bij de huidige actie.
taskHub De naam van uw taakhub.
nieuweEvenementen Een door komma's gescheiden lijst met geschiedenisgebeurtenissen die naar de tabel Geschiedenis in de opslag worden geschreven.

Problemen met verbindingsbeheer in het verbruiksabonnement

Apps op het Azure Functions Verbruiksabonnement zijn onderhevig aan verbindinglimieten. Veelvoorkomende symptomen zijn:

  • Onregelmatige connectiviteitsfouten bij het aanroepen van activiteitsfuncties of externe services.
  • Indelingen die sporadisch mislukken onder belasting.
  • Socketuitputtingsfouten in de logboeken.

Gebruik HttpClientFactory of gedeelde statische clients in plaats van nieuwe HttpClient exemplaren te maken bij elke functieaanroep, om het gebruik van verbindingen te verminderen. Zie Manage-verbindingen in Azure Functions voor gedetailleerde richtlijnen over groepsgewijze verbindingen en aanbevolen procedures.

Algemene tips

Aanbeveling

Voordat u ingaat op specifieke stappen voor probleemoplossing, moet u ervoor zorgen dat uw app de meest recente Durable Functions-extensieversie gebruikt. Meestal beperkt het gebruik van de nieuwste versie bekende problemen die al door andere gebruikers zijn gerapporteerd. Zie Upgrade Durable Functions extensieversie voor instructies voor het upgraden.

Het tabblad Diagnose en problemen oplossen in de Azure-portal kan helpen bij het bewaken en diagnosticeren van problemen met betrekking tot uw toepassing en het voorstellen van mogelijke oplossingen. Zie Azure Function-app diagnostics voor meer informatie.

Ondersteuning krijgen voor problemen met Durable Functions

Als u het probleem niet kunt oplossen met deze handleiding, kunt u een ondersteuningsticket indienen door de blade Nieuwe ondersteuningsaanvraag te openen in de blade Ondersteuning en probleemoplossing van de pagina van uw functie-app in de Azure-portal.

Schermopname van de ondersteuningsaanvraagpagina in de Azure portal.

Voor vragen en ondersteuning van de community opent u een probleem in een van de volgende GitHub opslagplaatsen. Wanneer u een fout rapporteert, neemt u informatie op zoals betrokken exemplaar-id's, tijdsbereiken in UTC met het probleem, de naam van de toepassing (indien mogelijk) en de implementatieregio om onderzoeken te versnellen.