Dela via


Hantera instanser i Durable Functions i Azure

Orkestreringar i Durable Functions är långvariga tillståndskänsliga funktioner som kan startas, frågas, pausas, återupptas och avslutas med hjälp av inbyggda hanterings-API:er. Flera andra API:er för instanshantering exponeras också av durable functions-orkestreringsklientbindningen, till exempel att skicka externa händelser till instanser, rensa instanshistorik osv. Den här artikeln innehåller information om alla instanshanteringsåtgärder som stöds.

Starta instanser

Metoden start-new (eller schedule-new) på orkestreringsklientbindningen startar en ny orkestreringsinstans. Internt skriver den här metoden ett meddelande via Durable Functions-lagringsprovidern och returnerar sedan. Det här meddelandet utlöser asynkront starten av en orkestreringsfunktion med det angivna namnet.

Parametrarna för att starta en ny orkestreringsinstans är följande:

  • Namn: Namnet på orkestreringsfunktionen som ska schemaläggas.
  • Indata: Alla JSON-serialiserbara data som ska skickas som indata till orchestrator-funktionen.
  • InstanceId: (Valfritt) Instansens unika ID. Om du inte anger den här parametern använder metoden ett slumpmässigt ID.

Dricks

Använd en slumpmässig identifierare för instans-ID:t när det är möjligt. Slumpmässiga instans-ID:er hjälper till att säkerställa en lika belastningsfördelning när du skalar orkestreringsfunktioner över flera virtuella datorer. Rätt tid att använda icke-slumpmässiga instans-ID är när ID:t måste komma från en extern källa eller när du implementerar singleton orchestrator-mönstret .

Följande kod är en exempelfunktion som startar en ny orkestreringsinstans:

[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}'.");
}

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

Azure Functions Core Tools

Du kan också starta en instans direkt med hjälp func durable start-new av kommandot i Core Tools, som tar följande parametrar:

  • function-name (krävs): Namnet på funktionen som ska startas.
  • input (valfritt): Indata till funktionen, antingen infogad eller via en JSON-fil. För filer lägger du till ett prefix i sökvägen till filen med @, till exempel @path/to/file.json.
  • id (valfritt): ID för orkestreringsinstansen. Om du inte anger den här parametern använder kommandot ett slumpmässigt GUID.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet är DurableFunctionsHub. Du kan också ange detta i host.json med durableTask:HubName.

Kommentar

Core Tools-kommandon förutsätter att du kör dem från rotkatalogen i en funktionsapp. Om du uttryckligen anger parametrarna connection-string-setting och task-hub-name kan du köra kommandona från valfri katalog. Även om du kan köra de här kommandona utan att en funktionsappvärd körs kan det hända att du inte kan se några effekter om inte värden körs. Kommandot skickar till exempel start-new ett startmeddelande till måluppgiftshubben, men orkestreringen körs inte om det inte finns en värdprocess för funktionsappen som kan bearbeta meddelandet.

Kommentar

Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Följande kommando startar funktionen med namnet HelloWorld och skickar innehållet i filen counter-data.json till den:

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

Frågeinstanser

När du har startat nya orkestreringsinstanser behöver du förmodligen köra frågor mot deras körningsstatus för att lära dig om de körs, har slutförts eller har misslyckats.

Metoden get-statusorkestreringsklientbindningen frågar statusen för en orkestreringsinstans.

Det tar en instanceId (obligatorisk), showHistory (valfritt), showHistoryOutput (valfritt) och showInput (valfritt) som parametrar.

  • showHistory: Om det är inställt på trueinnehåller svaret körningshistoriken.
  • showHistoryOutput: Om värdet är trueinställt på innehåller körningshistoriken aktivitetsutdata.
  • showInput: Om det är inställt falsepå innehåller svaret inte indata för funktionen. Standardvärdet är true.

Metoden returnerar ett objekt med följande egenskaper:

  • Namn: Namnet på orkestreringsfunktionen.
  • InstanceId: Instans-ID:t för orkestreringen (bör vara samma som instanceId indata).
  • CreatedTime: Den tid då orkestreringsfunktionen började köras.
  • LastUpdatedTime: Den tid då orkestreringen senast kontrollpunktades.
  • Indata: Indata för funktionen som ett JSON-värde. Det här fältet fylls inte i om showInput det är falskt.
  • CustomStatus: Anpassad orkestreringsstatus i JSON-format.
  • Utdata: Utdata för funktionen som ett JSON-värde (om funktionen har slutförts). Om orkestreringsfunktionen misslyckades innehåller den här egenskapen information om felet. Om orkestreringsfunktionen pausades eller avslutades innehåller den här egenskapen orsaken till avstängningen eller avslutningen (om någon).
  • RuntimeStatus: Ett av följande värden:
    • Väntar: Instansen har schemalagts men har ännu inte börjat köras.
    • Körs: Instansen har börjat köras.
    • Slutförd: Instansen har slutförts normalt.
    • ContinuedAsNy: Instansen har startat om sig själv med en ny historik. Det här tillståndet är ett tillfälligt tillstånd.
    • Misslyckades: Instansen misslyckades med ett fel.
    • Avslutad: Instansen stoppades plötsligt.
    • Pausad: Instansen avbröts och kan återupptas vid en senare tidpunkt.
  • Historik: Orkestreringens körningshistorik. Det här fältet fylls bara i om showHistory är inställt på true.

Kommentar

En orkestrerare markeras inte som Completed förrän alla schemalagda aktiviteter har slutförts och orkestratorn har återvänt. Med andra ord räcker det inte att en orkestrerare når sin return instruktion för att markeras som Completed. Detta är särskilt relevant för fall där WhenAny används. Dessa orkestratorer ofta return innan alla schemalagda aktiviteter har utförts.

Den här metoden returnerar null (.NET och Java), undefined (JavaScript) eller None (Python) om instansen inte finns.

[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.
}

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

Azure Functions Core Tools

Du kan också hämta status för en orkestreringsinstans direkt med hjälp func durable get-runtime-status av kommandot i Core Tools.

Kommentar

Core Tools-kommandon stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Kommandot durable get-runtime-status tar följande parametrar:

  • id (krävs): ID för orkestreringsinstansen.
  • show-input (valfritt): Om värdet är inställt truepå innehåller svaret indata för funktionen. Standardvärdet är false.
  • show-output (valfritt): Om värdet är inställt på trueinnehåller svaret utdata för funktionen. Standardvärdet är false.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet är DurableFunctionsHub. Den kan också anges i host.json med durableTask:HubName.

Följande kommando hämtar statusen (inklusive indata och utdata) för en instans med ett orkestreringsinstans-ID för 0ab8c55a66644d68a3a8b220b12d209c. Det förutsätter att du kör func kommandot från funktionsappens rotkatalog:

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

Du kan använda durable get-history kommandot för att hämta historiken för en orkestreringsinstans. Det tar följande parametrar:

  • id (krävs): ID för orkestreringsinstansen.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet är DurableFunctionsHub. Den kan också anges i host.json med durableTask:HubName.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c

Fråga alla instanser

Du kan använda API:er i ditt språk-SDK för att fråga efter status för alla orkestreringsinstanser i aktivitetshubben. Det här "list-instances" eller "get-status" -API:et returnerar en lista över objekt som representerar orkestreringsinstanserna som matchar frågeparametrarna.

[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.
}

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

Azure Functions Core Tools

Det är också möjligt att fråga instanser direkt med hjälp func durable get-instances av kommandot i Core Tools.

Kommentar

Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Kommandot durable get-instances tar följande parametrar:

  • top (valfritt): Det här kommandot stöder växling. Den här parametern motsvarar antalet instanser som hämtats per begäran. Standardvärdet är 10.
  • continuation-token (valfritt): En token som anger vilken sida eller vilket avsnitt av instanser som ska hämtas. Varje get-instances körning returnerar en token till nästa uppsättning instanser.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet är DurableFunctionsHub. Den kan också anges i host.json med durableTask:HubName.
func durable get-instances

Fråga instanser med filter

Vad händer om du inte behöver all information som en standardinstansfråga kan ge? Vad händer om du till exempel bara letar efter orkestreringsgenereringstiden eller orkestreringskörningsstatusen? Du kan begränsa frågan genom att använda filter.

[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));
    }
}

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

Azure Functions Core Tools

I Azure Functions Core Tools kan du också använda durable get-instances kommandot med filter. Förutom de ovan nämnda topparametrarna , continuation-token, connection-string-settingoch task-hub-name kan du använda tre filterparametrar (created-after, created-beforeoch runtime-status).

Kommentar

Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Följande är parametrarna durable get-instances för kommandot.

  • created-after (valfritt): Hämta de instanser som skapats efter detta datum/tid (UTC). ISO 8601-formaterade datetimes accepteras.
  • created-before (valfritt): Hämta de instanser som skapats före detta datum/tid (UTC). ISO 8601-formaterade datetimes accepteras.
  • runtime-status (valfritt): Hämta instanserna med en viss status (till exempel köra eller slutförda). Kan ge flera (blankstegsavgränsade) statusar.
  • top (valfritt): Antal instanser som hämtats per begäran. Standardvärdet är 10.
  • continuation-token (valfritt): En token som anger vilken sida eller vilket avsnitt av instanser som ska hämtas. Varje get-instances körning returnerar en token till nästa uppsättning instanser.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet är DurableFunctionsHub. Den kan också anges i host.json med durableTask:HubName.

Om du inte anger några filter (created-after, created-beforeeller runtime-status) hämtar top kommandot bara instanser, utan hänsyn till körningsstatus eller skapandetid.

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

Avsluta instanser

Om du har en orkestreringsinstans som tar för lång tid att köra, eller om du bara behöver stoppa den innan den slutförs av någon anledning, kan du avsluta den.

De två parametrarna för termins-API:et är ett instans-ID och en orsakssträng som skrivs till loggar och till instansstatusen.

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

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

En avslutad instans övergår så småningom till tillståndet Terminated . Den här övergången sker dock inte omedelbart. I stället placeras avsluta-åtgärden i aktivitetshubben tillsammans med andra åtgärder för den instansen. Du kan använda API:erna för instansfrågor för att veta när en avslutad instans faktiskt har nått Terminated tillståndet.

Kommentar

Instansavslut sprids för närvarande inte. Aktivitetsfunktioner och underorkestreringar körs till slutförande, oavsett om du har avslutat orkestreringsinstansen som anropade dem.

Pausa och återuppta instanser

Om du pausar en orkestrering kan du stoppa en orkestrering som körs. Till skillnad från avslutning har du möjlighet att återuppta en pausad orkestrerare vid en senare tidpunkt.

De två parametrarna för det pausade API:et är ett instans-ID och en orsakssträng som skrivs till loggar och till instansstatusen.

[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);
}

En pausad instans övergår så småningom till tillståndet Suspended . Den här övergången sker dock inte omedelbart. I stället placeras pausåtgärden i kö i aktivitetshubben tillsammans med andra åtgärder för den instansen. Du kan använda api:erna för instansfrågor för att veta när en instans som körs faktiskt har nått tillståndet Pausat.

När en pausad orkestrerare återupptas ändras dess status tillbaka till Running.

Azure Functions Core Tools

Du kan också avsluta en orkestreringsinstans direkt med hjälp func durable terminate av kommandot i Core Tools.

Kommentar

Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Kommandot durable terminate tar följande parametrar:

  • id (krävs): ID för orkestreringsinstansen som ska avslutas.
  • reason (valfritt): Orsak till uppsägning.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet är DurableFunctionsHub. Den kan också anges i host.json med durableTask:HubName.

Följande kommando avslutar en orkestreringsinstans med ett ID för 0ab8c55a66644d68a3a8b220b12d209c:

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

Skicka händelser till instanser

I vissa scenarier måste orkestreringsfunktioner vänta och lyssna efter externa händelser. Exempelscenarier där detta är användbart är scenarier för övervakning och mänsklig interaktion .

Du kan skicka händelsemeddelanden till instanser som körs med hjälp av api:et för att skapa händelse i orkestreringsklienten. Orkestreringar kan lyssna och svara på dessa händelser med hjälp av väntan på extern händelseorkestrerings-API .

Parametrarna för höjningshändelsen är följande:

  • Instans-ID: Instansens unika ID.
  • Händelsenamn: Namnet på den händelse som ska skickas.
  • Händelsedata: En JSON-serialiserbar nyttolast som ska skickas till instansen.
[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);
}

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

Kommentar

Om det inte finns någon orkestreringsinstans med det angivna instans-ID:t ignoreras händelsemeddelandet. Om det finns en instans men den ännu inte väntar på händelsen lagras händelsen i instanstillståndet tills den är redo att tas emot och bearbetas.

Azure Functions Core Tools

Du kan också skapa en händelse till en orkestreringsinstans direkt med hjälp func durable raise-event av kommandot i Core Tools.

Kommentar

Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Kommandot durable raise-event tar följande parametrar:

  • id (krävs): ID för orkestreringsinstansen.
  • event-name: Namnet på händelsen som ska genereras.
  • event-data (valfritt): Data som ska skickas till orkestreringsinstansen. Det kan vara sökvägen till en JSON-fil, eller så kan du ange data direkt på kommandoraden.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet är DurableFunctionsHub. Den kan också anges i host.json med 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

Vänta tills orkestrering har slutförts

I långvariga orkestreringar kanske du vill vänta och få resultatet av en orkestrering. I dessa fall är det också användbart att kunna definiera en tidsgräns för orkestreringen. Om tidsgränsen överskrids ska orkestreringens tillstånd returneras i stället för resultatet.

API:et "vänta på slutförande eller skapa kontrollstatussvar" kan användas för att hämta faktiska utdata från en orkestreringsinstans synkront. Som standard har den här metoden en standardtimeout på 10 sekunder och ett avsökningsintervall på 1 sekund.

Här är ett exempel på en HTTP-utlösarfunktion som visar hur du använder det här API:et:

// 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));
        }
    }
}

Anropa funktionen med följande rad. Använd 2 sekunder för tidsgränsen och 0,5 sekunder för återförsöksintervallet:

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

Kommentar

Ovanstående cURL-kommando förutsätter att du har en orchestrator-funktion med namnet E1_HelloSequence i projektet. På grund av hur HTTP-utlösarfunktionen skrivs kan du ersätta den med namnet på valfri orkestreringsfunktion i projektet.

Beroende på den tid som krävs för att hämta svaret från orkestreringsinstansen finns det två fall:

  • Orkestreringsinstanserna slutförs inom den definierade tidsgränsen (i det här fallet 2 sekunder) och svaret är den faktiska orkestreringsinstansens utdata, som levereras synkront:
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!"
]
  • Orkestreringsinstanserna kan inte slutföras inom den definierade tidsgränsen och svaret är standardvärdet som beskrivs i HTTP API URL-identifiering:
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}"
}

Kommentar

Formatet på webhook-URL:erna kan variera beroende på vilken version av Azure Functions-värden du kör. Föregående exempel är för Azure Functions 3.0-värden.

Hämta HTTP-hanteringswebbhooks-URL:er

Du kan använda ett externt system för att övervaka eller för att skapa händelser till en orkestrering. Externa system kan kommunicera med Durable Functions via webhook-URL:er som ingår i standardsvaret som beskrivs i HTTP API URL-identifiering. Webhook-URL:erna kan också nås programmatiskt med hjälp av orkestreringsklientbindningen. Mer specifikt kan API:et skapa HTTP-hanteringsnyttolast användas för att hämta ett serialiserbart objekt som innehåller dessa webhook-URL:er.

API:et för att skapa HTTP-hanteringsnyttolast har en parameter:

  • Instans-ID: Instansens unika ID.

Metoderna returnerar ett objekt med följande strängegenskaper:

  • ID: Instans-ID för orkestreringen (bör vara samma som InstanceId indata).
  • StatusQueryGetUri: Status-URL:en för orkestreringsinstansen.
  • SendEventPostUri: URL:en "raise event" för orkestreringsinstansen.
  • TerminatePostUri: URL:en "avsluta" för orkestreringsinstansen.
  • PurgeHistoryDeleteUri: URL:en för "rensningshistorik" för orkestreringsinstansen.
  • suspendPostUri: URL:en "pausa" för orkestreringsinstansen.
  • resumePostUri: URL:en "återuppta" för orkestreringsinstansen.

Funktioner kan skicka instanser av dessa objekt till externa system för att övervaka eller skapa händelser på motsvarande orkestreringar, enligt följande exempel:

[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 };
}

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda DurableActivityContext i stället för IDurableActivityContext, du måste använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

Spola tillbaka instanser (förhandsversion)

Om du har ett orkestreringsfel av en oväntad anledning kan du spola tillbaka instansen till ett tidigare felfritt tillstånd med hjälp av ett API som skapats för detta ändamål.

Kommentar

Det här API:et är inte avsett att ersätta korrekt felhantering och återförsöksprinciper. I stället är det avsett att endast användas i fall där orkestreringsinstanser misslyckas av oväntade skäl. Orkestreringar i andra tillstånd än Failed (t.ex. , Running, TerminatedPending, ) Completedkan inte "återskapas". Mer information om felhantering och återförsöksprinciper finns i artikeln Felhantering .

RewindAsync Använd metoden (.NET) eller rewind (JavaScript) för orkestreringsklientbindningenför att återställa orkestreringen till körningstillståndet. Den här metoden kör även om de aktivitets- eller underorkestreringskörningsfel som orsakade orkestreringsfelet.

Anta till exempel att du har ett arbetsflöde som omfattar en rad mänskliga godkännanden. Anta att det finns en serie aktivitetsfunktioner som meddelar någon att deras godkännande behövs och väntar ut realtidssvaret. När alla godkännandeaktiviteter har fått svar eller överskriden tidsgräns antar du att en annan aktivitet misslyckas på grund av en programfelkonfiguration, till exempel en ogiltig databas anslutningssträng. Resultatet är ett orkestreringsfel djupt in i arbetsflödet. Med API:et RewindAsync (.NET) eller rewind (JavaScript) kan en programadministratör åtgärda konfigurationsfelet och spola tillbaka den misslyckade orkestreringen till tillståndet omedelbart före felet. Inget av stegen för mänsklig interaktion behöver godkännas på nytt och orkestreringen kan nu slutföras.

Kommentar

Återspolningsfunktionen har inte stöd för att spola tillbaka orkestreringsinstanser som använder varaktiga timers.

[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);
}

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

Azure Functions Core Tools

Du kan också spola tillbaka en orkestreringsinstans direkt med hjälp func durable rewind av kommandot i Core Tools.

Kommentar

Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Kommandot durable rewind tar följande parametrar:

  • id (krävs): ID för orkestreringsinstansen.
  • reason (valfritt): Orsak till att orkestreringsinstansen spolas tillbaka.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Som standard används namnet på aktivitetshubben i host.json-filen.
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."

Rensa instanshistorik

Om du vill ta bort alla data som är associerade med en orkestrering kan du rensa instanshistoriken. Du kanske till exempel vill ta bort alla lagringsresurser som är associerade med en slutförd instans. Det gör du genom att använda rensningsinstans-API:et som definierats av orkestreringsklienten.

Det här första exemplet visar hur du rensar en enda orkestreringsinstans.

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

I nästa exempel visas en timerutlöst funktion som rensar historiken för alla orkestreringsinstanser som har slutförts efter det angivna tidsintervallet. I det här fallet tar den bort data för alla instanser som slutfördes för 30 dagar sedan. Den här exempelfunktionen är schemalagd att köras en gång per dag kl. 12:00 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
        });
}

Kommentar

Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient attributet i stället för DurableClient attributet och du måste använda DurableOrchestrationClient parametertypen i stället för IDurableOrchestrationClient. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .

Kommentar

För att rensningshistoriken ska lyckas måste körningsstatusen för målinstansen vara Slutförd, Avslutad eller Misslyckad.

Azure Functions Core Tools

Du kan rensa orkestreringsinstansens historik med hjälp func durable purge-history av kommandot i Core Tools. I likhet med det andra C#-exemplet i föregående avsnitt rensas historiken för alla orkestreringsinstanser som skapats under ett angivet tidsintervall. Du kan ytterligare filtrera rensade instanser efter körningsstatus.

Kommentar

Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Kommandot durable purge-history har flera parametrar:

  • created-after (valfritt): Rensa historiken för instanser som skapats efter detta datum/tid (UTC). ISO 8601-formaterade datetimes accepteras.
  • created-before (valfritt): Rensa historiken för instanser som skapats före detta datum/tid (UTC). ISO 8601-formaterade datetimes accepteras.
  • runtime-status (valfritt): Rensa historiken för instanser med en viss status (till exempel att köra eller slutföra). Kan ge flera (blankstegsavgränsade) statusar.
  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Som standard används namnet på aktivitetshubben i host.json-filen.

Följande kommando tar bort historiken för alla misslyckade instanser som skapades före den 14 november 2021 kl. 19:35 (UTC).

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

Ta bort en aktivitetshubb

func durable delete-task-hub Med kommandot i Core Tools kan du ta bort alla lagringsartefakter som är associerade med en viss aktivitetshubb, inklusive Azure-lagringstabeller, köer och blobar.

Kommentar

Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.

Kommandot durable delete-task-hub har två parametrar:

  • connection-string-setting(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.
  • task-hub-name (valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Som standard används namnet på aktivitetshubben i host.json-filen.

Följande kommando tar bort alla Azure Storage-data som är associerade med UserTest aktivitetshubben.

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

Nästa steg