Share via


Gids voor het oplossen van problemen met Durable Functions

Durable Functions is een uitbreiding van Azure Functions waarmee u serverloze indelingen kunt bouwen met behulp van gewone code. Zie het overzicht van Durable Functions voor meer informatie over Durable Functions.

Dit artikel bevat een handleiding voor het oplossen van veelvoorkomende scenario's in Durable Functions-apps.

Opmerking

Microsoft-ondersteuningstechnici zijn beschikbaar om te helpen bij het diagnosticeren van problemen met uw toepassing. Als u uw probleem niet kunt vaststellen met behulp van deze handleiding, kunt u een ondersteuningsticket indienen door de blade Nieuwe ondersteuningsaanvraag te openen in de sectie Ondersteuning en probleemoplossing van uw functie-app-pagina in Azure Portal.

Schermopname van de pagina met ondersteuningsaanvragen in Azure Portal.

Hint

Wanneer u fouten opspoort en problemen diagnosticeert, is het raadzaam om ervoor te zorgen dat uw app de nieuwste Durable Functions-extensieversie gebruikt. Meestal beperkt het gebruik van de nieuwste versie bekende problemen die al door andere gebruikers zijn gerapporteerd. Lees het artikel Versie van de Durable Functions-extensie upgraden voor instructies over het upgraden van uw extensieversie.

Het tabblad Problemen vaststellen en oplossen in Azure Portal is een nuttige resource om mogelijke problemen met betrekking tot uw toepassing te controleren en te diagnosticeren. Het biedt ook mogelijke oplossingen voor uw problemen op basis van de diagnose. Zie diagnostische gegevens van Azure Function-apps voor meer informatie.

Als de bovenstaande resources uw probleem niet hebben opgelost, geven de volgende secties advies voor specifieke toepassingsverschijnselen:

Orchestratie is vastgelopen in de Pending status

Wanneer u een orkestratie start, wordt er 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 het orchestratiebericht is opgehaald en succesvol verwerkt door een beschikbaar app-exemplaar, wordt de status veranderd naar "Actief" (of naar een andere status die niet "In afwachting" is).

Gebruik de volgende stappen om problemen met orchestratie-instanties op te lossen die voor onbepaalde tijd blijven hangen in de status In afwachting.

  • Controleer de Durable Task Framework-traceringen op waarschuwingen of fouten voor de getroffen instantie-ID van de orkestratie. Een voorbeeldquery vindt u in de sectie Traceerfouten/Waarschuwingen.

  • Controleer de Azure Storage-besturingswachtrijen die zijn toegewezen aan de vastgelopen orchestrator om te zien of het 'beginbericht' er nog steeds is. Raadpleeg voor meer informatie over de besturingswachtrijen de documentatie van de Azure Storage-provider.

  • Wijzig de platformconfiguratieversie van uw app in '64-bits'. Soms worden orkestraties niet gestart omdat de app geheugen opraakt. Als u overschakelt naar een 64-bits proces, kan de app meer geheugen toewijzen. Dit geldt alleen voor Abonnementen voor App Service Basic, Standard, Premium en Elastic Premium. Gratis of Verbruiksabonnementen bieden geen ondersteuning voor 64-bits processen.

Orchestratie begint na een lange vertraging

Meestal beginnen orkestraties binnen een paar seconden nadat ze zijn gepland. Er zijn echter bepaalde gevallen waarin orkestraties langer kunnen duren bij de start. Gebruik de volgende stappen om problemen op te lossen wanneer orkestraties meer dan een paar seconden nodig hebben om te beginnen met uitvoeren.

Orchestratie wordt niet voltooid / blijft hangen in de Running status

Als een orchestration gedurende een lange periode de status 'Actief' blijft, betekent dit meestal dat er wordt gewacht op een langlopende taak die gepland is om te worden voltooid. Het kan bijvoorbeeld wachten op een duurzame timertaak, een activiteitstaak of een externe gebeurtenistaak die moet worden voltooid. Als u echter merkt dat geplande taken succesvol zijn voltooid, maar de orkestratie nog steeds geen voortgang boekt, kan er een probleem zijn dat voorkomt dat de orkestratie doorgaat naar de volgende taak. We verwijzen vaak naar orkestraties in deze staat als 'vastgelopen orkestraties'.

Gebruik de volgende stappen om vastgelopen orkestraties op te lossen:

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

  • Controleer de controlewachtrijen van Azure Storage-accounts om te zien of er wachtrijen zijn die continu groeien. Deze KQL-query voor Azure Storage-berichten kan helpen bij het identificeren van problemen met het uit de wachtrij halen van orkestratieberichten. Als het probleem van invloed is op slechts één besturingswachtrij, kan dit duiden op een probleem dat alleen voor een specifiek app-exemplaar bestaat. In dat geval kan omhoog of omlaag worden geschaald om het beschadigde VM-exemplaar te verwijderen.

  • Gebruik de Application Insights-query in de sectie Azure Storage Messaging om te filteren op die wachtrijnaam als partitie-id en te zoeken naar problemen met betrekking tot die wachtrijpartitie voor beheer.

  • Bekijk de richtlijnen in best practice en diagnostische hulpprogramma's voor Durable Functions. Sommige problemen kunnen worden veroorzaakt door bekende Durable Functions-antipatronen.

  • Raadpleeg de documentatie over Durable Functions Versioning. Sommige problemen kunnen worden veroorzaakt door incompatibele wijzigingen in lopende orkestratie-instanties.

Orchestratie verloopt langzaam

Zware gegevensverwerking, interne fouten en onvoldoende rekenresources kunnen ertoe leiden dat indelingen langzamer worden uitgevoerd dan normaal. Gebruik de volgende stappen om problemen met orkestraties op te lossen die langer duren dan verwacht om uit te voeren:

  • Controleer de Durable Task Framework-logbestanden op waarschuwingen of fouten voor het betreffende orkestratie-instantie-ID. Een voorbeeldquery vindt u in de sectie Traceerfouten/Waarschuwingen.

  • Als uw app gebruikmaakt van het .NET-procesmodel, kunt u overwegen om uitgebreide sessies in te schakelen. Uitgebreide sessies kunnen de belasting van de geschiedenis minimaliseren, waardoor de verwerking kan worden vertraagd.

  • Controleer op knelpunten voor prestaties en schaalbaarheid. De prestaties van toepassingen zijn afhankelijk van veel factoren. Een hoog CPU-gebruik of een groot geheugenverbruik kan bijvoorbeeld leiden tot vertragingen. Lees Prestaties en schaal in Durable Functions voor uitgebreide richtlijnen.

Voorbeeldvragen

In deze sectie wordt beschreven hoe u problemen kunt oplossen door aangepaste KQL-query's te schrijven in het Azure Application Insights-exemplaar dat is geconfigureerd voor uw Azure Functions-app.

Azure Storage berichtgeving

Wanneer u de standaard Azure Storage-provider gebruikt, wordt alle Durable Functions-gedrag aangestuurd door berichten in de Azure Storage-wachtrij en worden alle statussen met betrekking tot een indeling opgeslagen in tabelopslag en blobopslag. Wanneer Tracering van Durable Task Framework is ingeschakeld, worden alle Interacties van Azure Storage vastgelegd in Application Insights. Deze gegevens zijn van cruciaal belang voor het opsporen van fouten in de uitvoering en prestaties.

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

De volgende query is bedoeld voor het inspecteren van end-to-end Azure Storage-interacties voor een specifieke orkestratie-instance. Bewerk start en orchestrationInstanceID om te filteren op tijdsbereik en instantie-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/waarschuwingen traceren

De volgende query zoekt naar fouten en waarschuwingen voor een bepaalde orchestratie-instantie. U moet een waarde opgeven 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/partitie-id-logboeken beheren

Met de volgende query wordt gezocht naar alle activiteiten die geassocieerd zijn met de controlewachtrij van een instance-id. U moet de waarde opgeven voor de instantie-id 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

Kolomreferentie van Application Insights

Hieronder ziet u een lijst met de kolommen die door de bovenstaande query's worden geprojecteerd en de bijbehorende beschrijvingen.

kolom Beschrijving
pid Proces-ID van het exemplaar van de functieapp. Dit is handig om te bepalen of het proces is gerecycled terwijl een orchestratie werd uitgevoerd.
taakNaam De naam van de gebeurtenis die wordt geregistreerd.
evenementtype Het type bericht, dat meestal werk vertegenwoordigt dat wordt uitgevoerd door een orchestrator. Hier vindt u een volledige lijst met mogelijke waarden en hun beschrijvingen.
verlengde sessie Booleaanse waarde die aangeeft of uitgebreide sessies zijn ingeschakeld.
rekening Het opslagaccount dat door de app wordt gebruikt.
bijzonderheden 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. Houd er rekening mee dat deze niet aanwezig is in SendMessage-gebeurtenissen omdat de bericht-id wordt gegenereerd door Azure Storage nadat we het bericht hebben 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 in de wachtrij is gezet. 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.