Exemplaren beheren in Durable Functions in Azure

Indelingen in Durable Functions zijn langlopende stateful functies die kunnen worden gestart, opgevraagd, onderbroken, hervat en beëindigd met behulp van ingebouwde beheer-API's. Verschillende andere beheer-API's voor exemplaren worden ook weergegeven door de Durable Functions-orchestration-clientbinding, zoals het verzenden van externe gebeurtenissen naar exemplaren, het opschonen van exemplaargeschiedenis, enzovoort. In dit artikel worden alle ondersteunde exemplaarbeheerbewerkingen beschreven.

Exemplaren starten

Met de methode start-new (of schedule-new) op de orchestration-clientbinding wordt een nieuw indelingsexemplaar gestart. Intern schrijft deze methode een bericht via de Durable Functions-opslagprovider en retourneert deze. Dit bericht activeert asynchroon het begin van een indelingsfunctie met de opgegeven naam.

De parameters voor het starten van een nieuw indelingsexemplaar zijn als volgt:

  • Naam: de naam van de orchestratorfunctie die moet worden gepland.
  • Invoer: Alle JSON-serialiseerbare gegevens die als invoer moeten worden doorgegeven aan de orchestratorfunctie.
  • InstanceId: (optioneel) De unieke id van het exemplaar. Als u deze parameter niet opgeeft, gebruikt de methode een willekeurige id.

Tip

Gebruik waar mogelijk een willekeurige id voor de exemplaar-id. Willekeurige exemplaar-id's zorgen voor een gelijke verdeling van de belasting wanneer u orchestratorfuncties schaalt op meerdere VM's. De juiste tijd voor het gebruik van niet-willekeurige exemplaar-id's is wanneer de id afkomstig moet zijn van een externe bron of wanneer u het singleton orchestrator-patroon implementeert.

De volgende code is een voorbeeldfunctie waarmee een nieuw indelingsexemplaar wordt gestart:

[FunctionName("HelloWorldQueueTrigger")]
public static async Task Run(
    [QueueTrigger("start-queue")] string input,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    string instanceId = await starter.StartNewAsync("HelloWorld", input);
    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Azure Functions Core Tools

U kunt een exemplaar ook rechtstreeks starten met behulp van de func durable start-new opdracht in Core Tools, waarbij de volgende parameters worden gebruikt:

  • function-name (vereist): naam van de functie die moet worden gestart.
  • input (optioneel): invoer voor de functie, inline of via een JSON-bestand. Voor bestanden voegt u een voorvoegsel toe aan het pad naar het bestand met @, zoals @path/to/file.json.
  • id (optioneel): id van het orchestration-exemplaar. Als u deze parameter niet opgeeft, gebruikt de opdracht een willekeurige GUID.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. De standaardwaarde is DurableFunctionsHub. U kunt dit ook instellen in host.json met behulp van durableTask:HubName.

Notitie

Core Tools-opdrachten gaan ervan uit dat u ze uitvoert vanuit de hoofdmap van een functie-app. Als u de en task-hub-name parameters expliciet opgeeftconnection-string-setting, kunt u de opdrachten uitvoeren vanuit elke map. Hoewel u deze opdrachten kunt uitvoeren zonder dat een functie-app-host wordt uitgevoerd, is het mogelijk dat u bepaalde effecten niet kunt observeren, tenzij de host wordt uitgevoerd. De start-new opdracht voert bijvoorbeeld een beginbericht uit in de doeltaakhub, maar de indeling wordt niet daadwerkelijk uitgevoerd, tenzij er een hostproces voor de functie-app wordt uitgevoerd dat het bericht kan verwerken.

Notitie

De Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

Met de volgende opdracht wordt de functie HelloWorld gestart en wordt de inhoud van het bestand aan het bestand counter-data.json doorgegeven:

func durable start-new --function-name HelloWorld --input @counter-data.json --task-hub-name TestTaskHub

Query-exemplaren

Nadat u nieuwe indelingsexemplaren hebt gestart, moet u waarschijnlijk een query uitvoeren op de runtimestatus om te zien of ze worden uitgevoerd, zijn voltooid of zijn mislukt.

Met de get-statusmethode op de orchestration-clientbinding wordt de status van een orchestration-exemplaar opgevraagd.

Er wordt een instanceId (vereist), (optioneel) showHistoryshowHistoryOutput en showInput (optioneel) als parameters gebruikt.

  • showHistory: Als dit is ingesteld true, bevat het antwoord de uitvoeringsgeschiedenis.
  • showHistoryOutput: Indien ingesteld op true, bevat de uitvoeringsgeschiedenis activiteitsuitvoer.
  • showInput: Als deze optie is ingesteld false, bevat het antwoord niet de invoer van de functie. De standaardwaarde is true.

De methode retourneert een object met de volgende eigenschappen:

  • Naam: De naam van de orchestratorfunctie.
  • InstanceId: de exemplaar-id van de indeling (moet hetzelfde zijn als de instanceId invoer).
  • CreatedTime: het tijdstip waarop de orchestratorfunctie is gestart.
  • LastUpdatedTime: het tijdstip waarop de indeling het laatst is gecontroleerd.
  • Invoer: De invoer van de functie als een JSON-waarde. Dit veld wordt niet ingevuld als showInput dit onwaar is.
  • CustomStatus: Aangepaste indelingsstatus in JSON-indeling.
  • Uitvoer: De uitvoer van de functie als een JSON-waarde (als de functie is voltooid). Als de orchestratorfunctie is mislukt, bevat deze eigenschap de foutdetails. Als de orchestratorfunctie is onderbroken of beëindigd, bevat deze eigenschap de reden voor de schorsing of beëindiging (indien van toepassing).
  • RuntimeStatus: een van de volgende waarden:
    • In behandeling: het exemplaar is gepland, maar is nog niet gestart.
    • Wordt uitgevoerd: het exemplaar is gestart.
    • Voltooid: het exemplaar is normaal voltooid.
    • ContinueAsNew: Het exemplaar is opnieuw opgestart met een nieuwe geschiedenis. Deze status is een tijdelijke status.
    • Mislukt: het exemplaar is mislukt met een fout.
    • Beëindigd: het exemplaar is plotseling gestopt.
    • Onderbroken: het exemplaar is onderbroken en kan later worden hervat.
  • Geschiedenis: De uitvoeringsgeschiedenis van de indeling. Dit veld wordt alleen ingevuld als showHistory dit is ingesteld op true.

Notitie

Een orchestrator wordt pas gemarkeerd als Completed wanneer alle geplande taken zijn voltooid en de orchestrator is geretourneerd. Met andere woorden, het is niet voldoende voor een orchestrator om zijn return verklaring te bereiken zodat deze wordt gemarkeerd als Completed. Dit is met name relevant voor gevallen waarin WhenAny wordt gebruikt; deze orchestrators vaak return voordat alle geplande taken zijn uitgevoerd.

Deze methode retourneert null (.NET en Java), undefined (JavaScript) of None (Python) als het exemplaar niet bestaat.

[FunctionName("GetStatus")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("check-status-queue")] string instanceId)
{
    DurableOrchestrationStatus status = await client.GetStatusAsync(instanceId);
    // do something based on the current status.
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Azure Functions Core Tools

Het is ook mogelijk om de status van een indelingsexemplaar rechtstreeks op te halen met behulp van de func durable get-runtime-status opdracht in Core Tools.

Notitie

Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

De durable get-runtime-status opdracht gebruikt de volgende parameters:

  • id (vereist): id van het orchestration-exemplaar.
  • show-input (optioneel): indien ingesteld trueop, bevat het antwoord de invoer van de functie. De standaardwaarde is false.
  • show-output (optioneel): indien ingesteld trueop, bevat het antwoord de uitvoer van de functie. De standaardwaarde is false.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. De standaardwaarde is DurableFunctionsHub. Het kan ook worden ingesteld in host.json, met behulp van durableTask:HubName.

Met de volgende opdracht wordt de status (inclusief invoer en uitvoer) van een exemplaar opgehaald met een indelingsexemplaar-id van 0ab8c55a6644d68a3a8b220b12d209c. Hierbij wordt ervan uitgegaan dat u de func opdracht uitvoert vanuit de hoofdmap van de functie-app:

func durable get-runtime-status --id 0ab8c55a66644d68a3a8b220b12d209c --show-input true --show-output true

U kunt de durable get-history opdracht gebruiken om de geschiedenis van een orchestration-exemplaar op te halen. Hiervoor worden de volgende parameters gebruikt:

  • id (vereist): id van het orchestration-exemplaar.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. De standaardwaarde is DurableFunctionsHub. Het kan ook worden ingesteld in host.json met behulp van durableTask:HubName.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c

Query's uitvoeren op alle exemplaren

U kunt API's in uw taal-SDK gebruiken om een query uit te voeren op de statussen van alle indelingsexemplaren in uw taakhub. Deze API 'list-instances' of 'get-status' retourneert een lijst met objecten die de orchestration-exemplaren vertegenwoordigen die overeenkomen met de queryparameters.

[FunctionName("GetAllStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    var noFilter = new OrchestrationStatusQueryCondition();
    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        noFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }
    
    // Note: ListInstancesAsync only returns the first page of results.
    // To request additional pages provide the result.ContinuationToken
    // to the OrchestrationStatusQueryCondition's ContinuationToken property.
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Azure Functions Core Tools

Het is ook mogelijk om rechtstreeks query's uit te voeren op exemplaren met behulp van de func durable get-instances opdracht in Core Tools.

Notitie

De Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

De durable get-instances opdracht gebruikt de volgende parameters:

  • top (optioneel): deze opdracht ondersteunt paging. Deze parameter komt overeen met het aantal exemplaren dat per aanvraag is opgehaald. De standaardwaarde is 10.
  • continuation-token (optioneel): Een token om aan te geven welke pagina of sectie van exemplaren moet worden opgehaald. Elke get-instances uitvoering retourneert een token naar de volgende set exemplaren.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. De standaardwaarde is DurableFunctionsHub. Het kan ook worden ingesteld in host.json, met behulp van durableTask:HubName.
func durable get-instances

Query-exemplaren met filters

Wat gebeurt er als u niet alle informatie nodig hebt die een standaardexemplarenquery kan bieden? Wat gebeurt er bijvoorbeeld als u alleen op zoek bent naar de aanmaaktijd van de orchestration of de runtimestatus van de orchestration? U kunt uw query beperken door filters toe te passen.

[FunctionName("QueryStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    // Get the first 100 running or pending instances that were created between 7 and 1 day(s) ago
    var queryFilter = new OrchestrationStatusQueryCondition
    {
        RuntimeStatus = new[]
        {
            OrchestrationRuntimeStatus.Pending,
            OrchestrationRuntimeStatus.Running,
        },
        CreatedTimeFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
        CreatedTimeTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
        PageSize = 100,
    };
    
    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        queryFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Azure Functions Core Tools

In de Azure Functions Core Tools kunt u ook de durable get-instances opdracht met filters gebruiken. Naast de bovenstaande top, continuation-token, en connection-string-settingtask-hub-name parameters kunt u drie filterparameters (created-after, created-beforeen ) runtime-statusgebruiken.

Notitie

De Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

Hier volgen de parameters voor de durable get-instances opdracht.

  • created-after (optioneel): haal de exemplaren op die na deze datum/tijd (UTC) zijn gemaakt. Iso 8601 opgemaakte datum/tijd geaccepteerd.
  • created-before (optioneel): haal de exemplaren op die vóór deze datum/tijd (UTC) zijn gemaakt. Iso 8601 opgemaakte datum/tijd geaccepteerd.
  • runtime-status (optioneel): haal de exemplaren op met een bepaalde status (bijvoorbeeld actief of voltooid). Kan meerdere (door spaties gescheiden) statussen bieden.
  • top (optioneel): het aantal instanties dat per aanvraag is opgehaald. De standaardwaarde is 10.
  • continuation-token (optioneel): Een token om aan te geven welke pagina of sectie van exemplaren moet worden opgehaald. Elke get-instances uitvoering retourneert een token naar de volgende set exemplaren.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. De standaardwaarde is DurableFunctionsHub. Het kan ook worden ingesteld in host.json, met behulp van durableTask:HubName.

Als u geen filters (created-after, created-beforeof runtime-status) opgeeft, haalt de opdracht eenvoudig exemplaren op top , zonder rekening te houden met de runtimestatus of de aanmaaktijd.

func durable get-instances --created-after 2021-03-10T13:57:31Z --created-before  2021-03-10T23:59Z --top 15

Exemplaren beëindigen

Als u een indelingsexemplaar hebt dat te lang duurt om uit te voeren, of u hoeft deze alleen te stoppen voordat het om welke reden dan ook is voltooid, kunt u het beëindigen.

De twee parameters voor de beëindigings-API zijn een exemplaar-id en een redentekenreeks die naar logboeken en de status van het exemplaar wordt geschreven.

[FunctionName("TerminateInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("terminate-queue")] string instanceId)
{
    string reason = "Found a bug";
    return client.TerminateAsync(instanceId, reason);
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Een beëindigd exemplaar verandert uiteindelijk in de Terminated status. Deze overgang vindt echter niet onmiddellijk plaats. In plaats daarvan wordt de beëindigingsbewerking in de wachtrij geplaatst in de taakhub, samen met andere bewerkingen voor dat exemplaar. U kunt de query-API's van het exemplaar gebruiken om te weten wanneer een beëindigd exemplaar de Terminated status daadwerkelijk heeft bereikt.

Notitie

De beëindiging van het exemplaar wordt momenteel niet doorgegeven. Activiteitsfuncties en subindelingen worden uitgevoerd tot voltooiing, ongeacht of u het indelingsexemplaar met de naam ervan hebt beëindigd.

Instanties onderbreken en hervatten

Als u een indeling onderbreekt, kunt u een actieve indeling stoppen. In tegenstelling tot beëindiging hebt u de mogelijkheid om een onderbroken orchestrator op een later tijdstip te hervatten.

De twee parameters voor de suspend-API zijn een exemplaar-id en een redentekenreeks, die naar logboeken en de status van het exemplaar worden geschreven.

[FunctionName("SuspendResumeInstance")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("suspend-resume-queue")] string instanceId)
{
    string suspendReason = "Need to pause workflow";
    await client.SuspendAsync(instanceId, suspendReason);
    
    // Wait for 30 seconds to ensure that the orchestrator state is updated to suspended. 
    DateTime dueTime = context.CurrentUtcDateTime.AddSeconds(30);
    await context.CreateTimer(dueTime, CancellationToken.None);
    
    string resumeReason = "Continue workflow";
    await client.ResumeAsync(instanceId, resumeReason);
}

Een onderbroken instantie wordt uiteindelijk overgezet naar de Suspended status. Deze overgang vindt echter niet onmiddellijk plaats. In plaats daarvan wordt de onderbrekingsbewerking in de wachtrij geplaatst in de taakhub, samen met andere bewerkingen voor dat exemplaar. U kunt de QUERY-API's van het exemplaar gebruiken om te weten wanneer een actief exemplaar de status Onderbroken heeft bereikt.

Wanneer een onderbroken orchestrator wordt hervat, wordt de status weer gewijzigd in Running.

Azure Functions Core Tools

U kunt een indelingsexemplaar ook rechtstreeks beëindigen met behulp van de func durable terminate opdracht in Core Tools.

Notitie

De Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

De durable terminate opdracht gebruikt de volgende parameters:

  • id (vereist): id van het orchestration-exemplaar dat moet worden beëindigd.
  • reason (optioneel): reden voor beëindiging.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. De standaardwaarde is DurableFunctionsHub. Het kan ook worden ingesteld in host.json, met behulp van durableTask:HubName.

Met de volgende opdracht wordt een indelingsexemplaar beëindigd met een id van 0ab8c55a66644d68a3a8b220b12d209c:

func durable terminate --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Found a bug"

Gebeurtenissen verzenden naar exemplaren

In sommige scenario's moeten orchestratorfuncties wachten en luisteren naar externe gebeurtenissen. Voorbeelden van scenario's waarbij dit nuttig is, zijn onder andere de bewakings - en menselijke interactiescenario's .

U kunt gebeurtenismeldingen verzenden naar actieve exemplaren met behulp van de gebeurtenis-API genereren van de orchestration-client. Orchestrations kunnen luisteren naar en reageren op deze gebeurtenissen met behulp van de wacht op de orchestrator-API voor externe gebeurtenissen .

De parameters voor het genereren van gebeurtenissen zijn als volgt:

  • Exemplaar-id: de unieke id van het exemplaar.
  • Gebeurtenisnaam: de naam van de gebeurtenis die moet worden verzonden.
  • Gebeurtenisgegevens: een JSON-serialiseerbare nettolading die naar het exemplaar moet worden verzonden.
[FunctionName("RaiseEvent")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("event-queue")] string instanceId)
{
    int[] eventData = new int[] { 1, 2, 3 };
    return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Notitie

Als er geen indelingsexemplaar is met de opgegeven exemplaar-id, wordt het gebeurtenisbericht verwijderd. Als een exemplaar bestaat, maar nog niet op de gebeurtenis wacht, wordt de gebeurtenis opgeslagen in de instantiestatus totdat deze gereed is om te worden ontvangen en verwerkt.

Azure Functions Core Tools

U kunt ook rechtstreeks een gebeurtenis naar een orchestration-exemplaar genereren met behulp van de func durable raise-event opdracht in Core Tools.

Notitie

De Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

De durable raise-event opdracht gebruikt de volgende parameters:

  • id (vereist): id van het orchestration-exemplaar.
  • event-name: Naam van de gebeurtenis die moet worden gegenereerd.
  • event-data (optioneel): gegevens die naar het indelingsexemplaar moeten worden verzonden. Dit kan het pad naar een JSON-bestand zijn of u kunt de gegevens rechtstreeks op de opdrachtregel opgeven.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. De standaardwaarde is DurableFunctionsHub. Het kan ook worden ingesteld in host.json, met behulp van durableTask:HubName.
func durable raise-event --id 0ab8c55a66644d68a3a8b220b12d209c --event-name MyEvent --event-data @eventdata.json
func durable raise-event --id 1234567 --event-name MyOtherEvent --event-data 3

Wachten tot de indeling is voltooid

In langlopende indelingen wilt u misschien wachten en de resultaten van een indeling ophalen. In deze gevallen is het ook handig om een time-outperiode voor de indeling te definiëren. Als de time-out wordt overschreden, moet de status van de indeling worden geretourneerd in plaats van de resultaten.

De API 'Wachten op voltooiing of controlestatusantwoord maken' kan worden gebruikt om de werkelijke uitvoer van een orchestration-exemplaar synchroon op te halen. Deze methode heeft standaard een standaardtime-out van 10 seconden en een polling-interval van 1 seconde.

Hier volgt een voorbeeld van een HTTP-triggerfunctie die laat zien hoe u deze API gebruikt:

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace VSSample
{
    public static class HttpSyncStart
    {
        private const string Timeout = "timeout";
        private const string RetryInterval = "retryInterval";

        [FunctionName("HttpSyncStart")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/wait")]
            HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient starter,
            string functionName,
            ILogger log)
        {
            // Function input comes from the request content.
            object eventData = await req.Content.ReadAsAsync<object>();
            string instanceId = await starter.StartNewAsync(functionName, eventData);

            log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

            TimeSpan timeout = GetTimeSpan(req, Timeout) ?? TimeSpan.FromSeconds(30);
            TimeSpan retryInterval = GetTimeSpan(req, RetryInterval) ?? TimeSpan.FromSeconds(1);
            
            return await starter.WaitForCompletionOrCreateCheckStatusResponseAsync(
                req,
                instanceId,
                timeout,
                retryInterval);
        }

        private static TimeSpan? GetTimeSpan(HttpRequestMessage request, string queryParameterName)
        {
            string queryParameterStringValue = request.RequestUri.ParseQueryString()[queryParameterName];
            if (string.IsNullOrEmpty(queryParameterStringValue))
            {
                return null;
            }

            return TimeSpan.FromSeconds(double.Parse(queryParameterStringValue));
        }
    }
}

Roep de functie aan met de volgende regel. Gebruik 2 seconden voor de time-out en 0,5 seconde voor het interval voor opnieuw proberen:

curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"

Notitie

Bij de bovenstaande cURL-opdracht wordt ervan uitgegaan dat u een orchestratorfunctie hebt met de naam E1_HelloSequence in uw project. Vanwege de manier waarop de HTTP-triggerfunctie is geschreven, kunt u deze vervangen door de naam van elke orchestratorfunctie in uw project.

Afhankelijk van de tijd die nodig is om het antwoord van het orchestration-exemplaar op te halen, zijn er twee gevallen:

  • De indelingsexemplaren zijn voltooid binnen de gedefinieerde time-out (in dit geval 2 seconden) en het antwoord is de werkelijke uitvoer van het indelingsexemplaar, die synchroon wordt geleverd:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:14:29 GMT
Transfer-Encoding: chunked

[
    "Hello Tokyo!",
    "Hello Seattle!",
    "Hello London!"
]
  • De indelingsexemplaren kunnen niet worden voltooid binnen de gedefinieerde time-out en het antwoord is de standaardinstelling die wordt beschreven in http-API-URL-detectie:
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:13:51 GMT
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}
Retry-After: 10
Transfer-Encoding: chunked

{
    "id": "d3b72dddefce4e758d92f4d411567177",
    "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/raiseEvent/{eventName}?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/terminate?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "suspendPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/suspend?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "resumePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/resume?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}"
}

Notitie

De indeling van de webhook-URL's kan verschillen, afhankelijk van de versie van de Azure Functions-host die u uitvoert. Het voorgaande voorbeeld is voor de Azure Functions 3.0-host.

URL's voor HTTP-beheerwebhook ophalen

U kunt een extern systeem gebruiken om gebeurtenissen te bewaken of te genereren voor een indeling. Externe systemen kunnen communiceren met Durable Functions via de webhook-URL's die deel uitmaken van het standaardantwoord dat wordt beschreven in HTTP API-URL-detectie. De webhook-URL's kunnen ook programmatisch worden geopend met behulp van de orchestration-clientbinding. De API voor het maken van http-beheerpayloads kan worden gebruikt om een serializeerbaar object op te halen dat deze webhook-URL's bevat.

De PAYLOAD-API voor HTTP-beheer maken heeft één parameter:

  • Exemplaar-id: de unieke id van het exemplaar.

De methoden retourneren een object met de volgende tekenreekseigenschappen:

  • Id: De exemplaar-id van de indeling (moet hetzelfde zijn als de InstanceId invoer).
  • StatusQueryGetUri: de status-URL van het orchestration-exemplaar.
  • SendEventPostUri: de URL voor het genereren van gebeurtenissen van het orchestration-exemplaar.
  • TerminatePostUri: de 'terminate'-URL van het orchestration-exemplaar.
  • PurgeHistoryDeleteUri: de URL 'geschiedenis opschonen' van het orchestration-exemplaar.
  • suspendPostUri: de URL 'suspend' van het orchestration-exemplaar.
  • resumePostUri: de URL 'resume' van het orchestration-exemplaar.

Functies kunnen exemplaren van deze objecten verzenden naar externe systemen om gebeurtenissen in de bijbehorende indelingen te bewaken of te genereren, zoals wordt weergegeven in de volgende voorbeelden:

[FunctionName("SendInstanceInfo")]
public static void SendInstanceInfo(
    [ActivityTrigger] IDurableActivityContext ctx,
    [DurableClient] IDurableOrchestrationClient client,
    [CosmosDB(
        databaseName: "MonitorDB",
        containerName: "HttpManagementPayloads",
        Connection = "CosmosDBConnectionSetting")]out dynamic document)
{
    HttpManagementPayload payload = client.CreateHttpManagementPayload(ctx.InstanceId);

    // send the payload to Azure Cosmos DB
    document = new { Payload = payload, id = ctx.InstanceId };
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u in plaats van IDurableActivityContexthet kenmerk het OrchestrationClient kenmerk gebruiken DurableActivityContext in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Exemplaren terugspoelen (preview)

Als u om een onverwachte reden een indelingsfout hebt, kunt u het exemplaar terugspoelen naar een eerder goede status met behulp van een API die voor dat doel is gebouwd.

Notitie

Deze API is niet bedoeld als vervanging voor de juiste foutafhandeling en beleid voor opnieuw proberen. In plaats daarvan is het bedoeld om alleen te worden gebruikt in gevallen waarin indelingsexemplaren om onverwachte redenen mislukken. Indelingen in andere statussen dan Failed (bijvoorbeeld Running, , Pending, TerminatedCompleted) kunnen niet "opnieuw worden uitgevoerd". Zie het artikel Foutafhandeling voor meer informatie over foutafhandeling en beleid voor opnieuw proberen.

Gebruik de RewindAsync methode (.NET) of rewind (JavaScript) van de orchestration-clientbinding om de indeling weer in de status Actief te plaatsen. Met deze methode worden ook de uitvoeringsfouten van de activiteit of subindeling opnieuw uitgevoerd die de indelingsfout hebben veroorzaakt.

Stel dat u een werkstroom hebt met een reeks menselijke goedkeuringen. Stel dat er een reeks activiteitsfuncties zijn die iemand op de hoogte stellen dat hun goedkeuring nodig is en wachten op het realtime-antwoord. Nadat alle goedkeuringsactiviteiten antwoorden hebben ontvangen of een time-out hebben opgetreden, moet u aannemen dat een andere activiteit mislukt vanwege een onjuiste configuratie van een toepassing, zoals een ongeldige database verbindingsreeks. Het resultaat is een indelingsfout diep in de werkstroom. Met de RewindAsync (.NET) of rewind (JavaScript)-API kan een toepassingsbeheerder de configuratiefout oplossen en de mislukte indeling terugspoelen naar de status direct vóór de fout. Geen van de stappen voor menselijke interactie hoeft opnieuw te worden goedgekeurd en de indeling kan nu worden voltooid.

Notitie

De functie voor terugspoelen biedt geen ondersteuning voor het terugspoelen van indelingsexemplaren die duurzame timers gebruiken.

[FunctionName("RewindInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("rewind-queue")] string instanceId)
{
    string reason = "Orchestrator failed and needs to be revived.";
    return client.RewindAsync(instanceId, reason);
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Azure Functions Core Tools

U kunt een indelingsexemplaar ook rechtstreeks terugspoelen met behulp van de func durable rewind opdracht in Core Tools.

Notitie

De Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

De durable rewind opdracht gebruikt de volgende parameters:

  • id (vereist): id van het orchestration-exemplaar.
  • reason (optioneel): reden voor het terugspoelen van het orchestration-exemplaar.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. Standaard wordt de naam van de taakhub in het host.json-bestand gebruikt.
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."

Exemplaargeschiedenis leegmaken

Als u alle gegevens wilt verwijderen die zijn gekoppeld aan een indeling, kunt u de exemplaargeschiedenis opschonen. U kunt bijvoorbeeld alle opslagbronnen verwijderen die zijn gekoppeld aan een voltooid exemplaar. Gebruik hiervoor de API voor het opschonen van exemplaren die is gedefinieerd door de orchestration-client.

In dit eerste voorbeeld ziet u hoe u één orchestration-exemplaar kunt opschonen.

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("purge-queue")] string instanceId)
{
    return client.PurgeInstanceHistoryAsync(instanceId);
}

In het volgende voorbeeld ziet u een door timer geactiveerde functie waarmee de geschiedenis wordt opgeschoond voor alle indelingsexemplaren die zijn voltooid na het opgegeven tijdsinterval. In dit geval worden gegevens verwijderd voor alle exemplaren die 30 of meer dagen geleden zijn voltooid. Deze voorbeeldfunctie wordt gepland om één keer per dag uit te voeren, om 12:00 UUR UTC:

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
    return client.PurgeInstanceHistoryAsync(
        DateTime.MinValue,
        DateTime.UtcNow.AddDays(-30),  
        new List<OrchestrationStatus>
        {
            OrchestrationStatus.Completed
        });
}

Notitie

De vorige C#-code is voor Durable Functions 2.x. Voor Durable Functions 1.x moet u het kenmerk gebruiken OrchestrationClient in plaats van het DurableClient kenmerk en moet u het DurableOrchestrationClient parametertype gebruiken in plaats van IDurableOrchestrationClient. Zie het artikel Over Durable Functions-versies voor meer informatie over de verschillen tussen versies.

Notitie

De runtimestatus van het doelexemplaren moet zijn voltooid, beëindigd of mislukt om de bewerking voor het opschonen van de geschiedenis te voltooien.

Azure Functions Core Tools

U kunt de geschiedenis van een orchestration-exemplaar opschonen met behulp van de func durable purge-history opdracht in Core Tools. Net als in het tweede C#-voorbeeld in de vorige sectie wordt de geschiedenis verwijderd voor alle indelingsexemplaren die tijdens een opgegeven tijdsinterval zijn gemaakt. U kunt opgeschoonde exemplaren verder filteren op runtimestatus.

Notitie

De Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

De durable purge-history opdracht heeft verschillende parameters:

  • created-after (optioneel): verwijder de geschiedenis van exemplaren die na deze datum/tijd (UTC) zijn gemaakt. Iso 8601 opgemaakte datum/tijd geaccepteerd.
  • created-before (optioneel): verwijder de geschiedenis van exemplaren die vóór deze datum/tijd (UTC) zijn gemaakt. Iso 8601 opgemaakte datum/tijd geaccepteerd.
  • runtime-status (optioneel): verwijder de geschiedenis van exemplaren met een bepaalde status (bijvoorbeeld actief of voltooid). Kan meerdere (door spaties gescheiden) statussen bieden.
  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. Standaard wordt de naam van de taakhub in het host.json-bestand gebruikt.

Met de volgende opdracht verwijdert u de geschiedenis van alle mislukte exemplaren die zijn gemaakt vóór 14 november 2021 om 17:35 uur (UTC).

func durable purge-history --created-before 2021-11-14T19:35:00.0000000Z --runtime-status failed

Een taakhub verwijderen

Met behulp van de func durable delete-task-hub opdracht in Core Tools kunt u alle opslagartefacten verwijderen die zijn gekoppeld aan een bepaalde taakhub, waaronder Azure-opslagtabellen, wachtrijen en blobs.

Notitie

De Core Tools-opdrachten worden momenteel alleen ondersteund wanneer u de standaard Azure Storage-provider gebruikt om de runtimestatus te behouden.

De durable delete-task-hub opdracht heeft twee parameters:

  • connection-string-setting(optioneel): naam van de toepassingsinstelling met de opslag verbindingsreeks die u wilt gebruiken. De standaardwaarde is AzureWebJobsStorage.
  • task-hub-name (optioneel): naam van de Durable Functions-taakhub die moet worden gebruikt. Standaard wordt de naam van de taakhub in het host.json-bestand gebruikt.

Met de volgende opdracht worden alle Azure-opslaggegevens verwijderd die zijn gekoppeld aan de UserTest taakhub.

func durable delete-task-hub --task-hub-name UserTest

Volgende stappen