Správa instancí orchestrace

Pomocí integrovaných rozhraní API pro správu instancí můžete v trvalých pracovních postupech spouštět, dotazovat, ukončovat, pozastavit, obnovit a vyprázdnit instance orchestrace. V Durable Functions klientská vazba orchestration zveřejňuje tato rozhraní API. Ve sadách SDK Durable Task jsou stejné operace dostupné prostřednictvím třídy DurableTaskClient. Tento článek ukazuje, jak provádět jednotlivé operace správy instancí s příklady kódu pro obě platformy.

Návod

Azure Durable Task Scheduler je doporučený back-end pro sady SDK Durable Functions i sady Durable Task SDK, který poskytuje plně spravované prostředí bez serveru pro spouštění trvalých pracovních postupů ve velkém měřítku.

Spuštění instancí

Metoda start-new (nebo schedule-new) v klientovi orchestrace spustí novou instanci orchestrace. Interně tato metoda zapíše zprávu do nakonfigurovaného backendu (například do Durable Task Scheduler) a poté se vrátí. Tato zpráva asynchronně aktivuje začátek orchestrace se zadaným názvem.

Tady jsou parametry pro spuštění nové instance orchestrace:

Parameter Description
Name Název orchestrátoru slouží k rozvrhu.
Vstup Jakákoli JSON-serializovatelná data, která by měla být předána jako vstup do orchestratorové funkce.
InstanceId (Volitelné) Unikátní ID instance. Pokud tento parametr nezadáte, použije metoda náhodné ID.

Návod

Kdykoli je to možné, použijte pro ID instance náhodný identifikátor. ID náhodných instancí pomáhají zajistit rovnoměrnou distribuci zatížení při škálování funkcí orchestrátoru napříč několika virtuálními počítači. Správný čas pro používání nenáhodných ID instancí nastává, když ID pochází z externího zdroje nebo při implementaci vzoru singleton orchestrátoru.

Parameter Description
Name Název orchestrace podle plánu.
Vstup Jakákoli JSON-serializovatelná data, která by měla být předána jako vstup do orchestrace.
InstanceId (Volitelné) Unikátní ID instance. Pokud tento parametr nezadáte, použije metoda náhodné ID.

Návod

Kdykoli je to možné, použijte pro ID instance náhodný identifikátor. ID náhodných instancí pomáhají zajistit rovnoměrnou distribuci zatížení při škálování orchestrací napříč několika virtuálními počítači. Správný čas pro používání nenáhodných ID instancí nastává, když ID pochází z externího zdroje nebo při implementaci vzoru singleton orchestrátoru.

Následující ukázková funkce spustí novou instanci orchestrace:

Izolovaný model pracovního procesu
[Function("HelloWorldQueueTrigger")]
public static async Task Run(
    [QueueTrigger("start-queue")] string input,
    [DurableClient] DurableTaskClient client,
    FunctionContext functionContext)
{
    string instanceId = await client.ScheduleNewOrchestrationInstanceAsync("HelloWorld", input);
    functionContext.GetLogger("HelloWorldQueueTrigger")
        .LogInformation("Started orchestration with ID = '{InstanceId}'.", instanceId);
}

Model v probíhajícím procesu
[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}'.");
}

Důležité

V současné době není sada POWERShell Durable Task SDK dostupná.

Následující kód ukazuje, jak spustit novou orchestrační instanci pomocí sady SDK Durable Task.

using Microsoft.DurableTask.Client;

// Schedule a new orchestration instance
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync("HelloWorld", input);
Console.WriteLine($"Started orchestration with ID = '{instanceId}'.");

// Optionally, wait for the orchestration to start
OrchestrationMetadata metadata = await client.WaitForInstanceStartAsync(instanceId, timeout: TimeSpan.FromSeconds(30));

Instance dotazů

Po spuštění nových instancí orchestrace budete pravděpodobně potřebovat zjistit jejich stav za běhu, abyste se dozvěděli, jestli jsou spuštěné, dokončené nebo neúspěšné.

Metoda get-status v klientovi orchestrace vrátí stav instance orchestrace.

Jako parametry přebírá instanceId (povinné), showHistory (volitelné), showHistoryOutput (volitelné) a showInput (volitelné).

  • showHistory: Pokud je nastavená hodnota true, odpověď obsahuje historii spuštění.
  • showHistoryOutput: Pokud je nastavená hodnota true, historie provádění obsahuje výstupy aktivit.
  • showInput: Pokud je nastavená hodnota false, odpověď neobsahuje vstup funkce. Výchozí hodnota je true.

Metoda vrátí objekt s následujícími vlastnostmi:

Property Description
Name Název funkce orchestrátoru.
InstanceId Instance ID orchestrace (mělo by být stejné jako vstup).instanceId
Čas vytvoření Čas, kdy funkce orchestrátoru začíná běžet.
LastUpdatedTime Čas, kdy orchestrace končí, jsou kontrolními body.
Vstup Vstup funkce jako hodnota JSON. Toto pole není vyplněno, pokud showInput je false.
CustomStatus Stav vlastní orchestrace ve formátu JSON.
Output Výstup funkce jako JSON hodnota (pokud funkce dokončí). Pokud funkce orchestrátoru selže, tato vlastnost obsahuje podrobnosti o selhání. Pokud je funkce orchestrátoru pozastavená nebo ukončena, tato vlastnost obsahuje důvod pozastavení nebo ukončení (pokud existuje).
RuntimeStatus: Čeká Instance je naplánovaná, ale ještě nezačala běžet.
RuntimeStatus: Běží Instance běží.
RuntimeStatus: Dokončeno Instance probíhala normálně.
Stav délky: PokračováníNové Instance se znovu spustila s novou historií. Tento stav je přechodný.
RuntimeStatus: Neúspěšný Instance selhala s chybou.
RuntimeStatus: Ukončeno Událost náhle ustala.
RuntimeStatus: Pozastaveno Instance je pozastavena a může být později obnovena.
historie Historie provedení orchestrace. Toto pole je vyplněno pouze v případě, že showHistory je nastaveno na truehodnotu .
Parameter Description
showHistory Pokud je nastaveno na true, odpověď obsahuje historii vykonání.
showHistoryOutput Pokud je nastaveno na true, historie provádění obsahuje výstupy aktivit.
showInput Pokud je nastaveno na false, odezva neobsahuje vstup orchestrace. Výchozí hodnota je true.

Metoda vrátí objekt s následujícími vlastnostmi:

Property Description
Name Název orchestrace.
InstanceId Instance ID orchestrace (mělo by být stejné jako vstup).instanceId
Čas vytvoření Čas, kdy orchestrace začíná běžet.
LastUpdatedTime Čas, kdy orchestrace končí, jsou kontrolními body.
Vstup Vstup orchestrace jako hodnota JSON. Toto pole není vyplněno, pokud showInput je false.
CustomStatus Stav vlastní orchestrace ve formátu JSON.
Output Výstup orchestrace jako JSON hodnota (pokud orchestrace dokončí). Pokud orchestrace selže, tato vlastnost obsahuje podrobnosti o selhání. Pokud je orchestrace pozastavena nebo ukončena, tato vlastnost obsahuje důvod pozastavení nebo ukončení (pokud existuje).
RuntimeStatus: Čeká Instance je naplánovaná, ale ještě nezačala běžet.
RuntimeStatus: Běží Instance běží.
RuntimeStatus: Dokončeno Instance probíhala normálně.
Stav délky: PokračováníNové Instance se znovu spustila s novou historií. Tento stav je přechodný.
RuntimeStatus: Neúspěšný Instance selhala s chybou.
RuntimeStatus: Ukončeno Událost náhle ustala.
RuntimeStatus: Pozastaveno Instance je pozastavena a může být obnovena později.
historie Historie provedení orchestrace. Toto pole je vyplněno pouze v případě, že showHistory je nastaveno na truehodnotu .

Poznámka:

Orchestrátor není označený jako Completed až do dokončení všech plánovaných úkolů a dokud orchestrátor nedokončí svou práci. Jinými slovy, není dostačující, aby orchestrátor dosáhl svého return prohlášení, aby byl označen jako Completed. To je zvlášť důležité pro případy, kdy WhenAny se používají; tyto orchestrátory často return před provedením všech naplánovaných úloh.

Tato metoda vrátí null (.NET a Java), undefined (JavaScript) nebo None (Python), pokud instance neexistuje.

Izolovaný model pracovního procesu
[Function("GetStatus")]
public static async Task Run(
    [DurableClient] DurableTaskClient client,
    [QueueTrigger("check-status-queue")] string instanceId)
{
    OrchestrationMetadata? metadata = await client.GetInstanceAsync(
        instanceId,
        getInputsAndOutputs: true);
    // Do something based on the current status.
}

Model v probíhajícím procesu
[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.
}

using Microsoft.DurableTask.Client;

// Get the status of an orchestration instance
OrchestrationMetadata? metadata = await client.GetInstanceAsync(instanceId, getInputsAndOutputs: true);
if (metadata != null)
{
    OrchestrationRuntimeStatus status = metadata.RuntimeStatus;
    // do something based on the current status
}

Vyhledej všechny instance orchestrace

Pomocí rozhraní API v sadě SDK jazyka můžete dotazovat stav všech instancí orchestrace v centru úloh. Toto rozhraní API "list-instance" nebo "get-status" vrátí seznam objektů, které představují instance orchestrace odpovídající parametrům dotazu.

Izolovaný model pracovního procesu
[Function("GetAllStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData request,
    [DurableClient] DurableTaskClient client,
    FunctionContext functionContext)
{
    ILogger logger = functionContext.GetLogger("GetAllStatus");
    AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(
        new OrchestrationQuery());

    await foreach (OrchestrationMetadata instance in instances)
    {
        logger.LogInformation("{Instance}", instance);
    }
}

Model v probíhajícím procesu
[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.
}

using Microsoft.DurableTask.Client;

// Query all orchestration instances
AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(new OrchestrationQuery());

await foreach (OrchestrationMetadata instance in instances)
{
    Console.WriteLine(instance.InstanceId);
}

Instance orchestrace dotazů s filtry

Co když nepotřebujete všechny informace, které poskytuje standardní dotaz instance? Co když například hledáte čas vytvoření orchestrace nebo stav běhu orchestrace? Zužte dotaz použitím filtrů.

Izolovaný model pracovního procesu
[Function("QueryStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData request,
    [DurableClient] DurableTaskClient client,
    FunctionContext functionContext)
{
    ILogger logger = functionContext.GetLogger("QueryStatus");
    var query = new OrchestrationQuery
    {
        Statuses = new[]
        {
            OrchestrationRuntimeStatus.Pending,
            OrchestrationRuntimeStatus.Running,
        },
        CreatedFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
        CreatedTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
        PageSize = 100,
    };

    await foreach (OrchestrationMetadata instance in client.GetAllInstancesAsync(query))
    {
        logger.LogInformation("{Instance}", instance);
    }
}

Model v probíhajícím procesu
[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 days 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));
    }
}

using Microsoft.DurableTask.Client;

// Get running or pending instances created in the last 7 days
var query = new OrchestrationQuery
{
    Statuses = new[] { OrchestrationRuntimeStatus.Running, OrchestrationRuntimeStatus.Pending },
    CreatedFrom = DateTime.UtcNow.AddDays(-7),
    CreatedTo = DateTime.UtcNow.AddDays(-1),
    PageSize = 100
};

AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(query);

await foreach (OrchestrationMetadata instance in instances)
{
    Console.WriteLine($"{instance.InstanceId}: {instance.RuntimeStatus}");
}

Ukončení instancí orchestrace

Pokud máte instanci orchestrace, která trvá příliš dlouho, nebo ji potřebujete zastavit, než se z nějakého důvodu dokončí, můžete ji ukončit.

Dva parametry rozhraní API pro ukončení jsou ID instance a řetězec důvodu , který zapisuje do protokolů a do stavu instance.

Izolovaný model pracovního procesu
[Function("TerminateInstance")]
public static Task Run(
    [DurableClient] DurableTaskClient client,
    [QueueTrigger("terminate-queue")] string instanceId)
{
    string reason = "Found a bug";
    return client.TerminateInstanceAsync(instanceId, reason);
}

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

using Microsoft.DurableTask.Client;

string reason = "Found a bug";
await client.TerminateInstanceAsync(instanceId, reason);

Ukončená instance nakonec přejde do Terminated stavu. Tento přechod se ale nestane okamžitě. Místo toho se operace ukončení zařadí do fronty v uzlu úloh spolu s dalšími operacemi pro danou instanci. Pomocí rozhraní API pro dotazy instance můžete zjistit, kdy ukončená instance skutečně dosáhla Terminated stavu.

Poznámka:

Ukončení instance se v současné době nešíruje. Funkce aktivit a dílčí orchestrace dokončí svůj běh, bez ohledu na to, zda ukončíte instanci orchestrace, která je volala.

Pozastavení a obnovení instancí orchestrace

Pozastavení orchestrace umožňuje zastavit spuštěnou orchestraci. Na rozdíl od ukončení orchestrace můžete později obnovit pozastavený orchestrátor.

Dva parametry pro pozastavené rozhraní API jsou ID instance a řetězec důvodu, který se zapisuje do protokolů a do stavu instance.

Izolovaný model pracovního procesu
[Function("SuspendResumeInstance")]
public static async Task Run(
    [DurableClient] DurableTaskClient client,
    [QueueTrigger("suspend-resume-queue")] string instanceId)
{
    // To suspend an orchestration
    string suspendReason = "Need to pause workflow";
    await client.SuspendInstanceAsync(instanceId, suspendReason);

    // To resume an orchestration
    string resumeReason = "Continue workflow";
    await client.ResumeInstanceAsync(instanceId, resumeReason);
}

Model v probíhajícím procesu
[FunctionName("SuspendResumeInstance")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("suspend-resume-queue")] string instanceId)
{
    // To suspend an orchestration
    string suspendReason = "Need to pause workflow";
    await client.SuspendAsync(instanceId, suspendReason);

    // To resume an orchestration
    string resumeReason = "Continue workflow";
    await client.ResumeAsync(instanceId, resumeReason);
}

using Microsoft.DurableTask.Client;

// To suspend an orchestration
string suspendReason = "Need to pause workflow";
await client.SuspendInstanceAsync(instanceId, suspendReason);

// To resume an orchestration
string resumeReason = "Continue workflow";
await client.ResumeInstanceAsync(instanceId, resumeReason);

Pozastavená instance nakonec přejde do Suspended stavu. K tomuto přechodu ale nedojde okamžitě. Místo toho je operace pozastavení zařazena do fronty v modulu úloh spolu s dalšími operacemi pro danou instanci. Pomocí rozhraní API pro dotazy instance zjistěte, kdy spuštěná instance skutečně dosáhla Suspended stavu.

Po obnovení pozastaveného orchestrátoru se jeho stav změní zpět na Running.

Odesílání událostí do instancí

V některých scénářích musí funkce orchestrátoru čekat a naslouchat externím událostem. Mezi příklady, kdy je tento přístup užitečný, patří scénáře monitorování a lidské interakce .

V některých scénářích musí orchestrace čekat a naslouchat externím událostem. Mezi příklady, kdy je tento přístup užitečný, patří scénáře monitorování a lidské interakce .

Oznámení událostí můžete odesílat do spuštěných instancí pomocí rozhraní API pro vyvolání událostí klienta orchestrace. Orchestrace mohou naslouchat těmto událostem a reagovat na ně pomocí API orchestrátoru čekání na externí událost.

Parametry pro vyvolání události jsou:

  • ID instance: Jedinečné ID instance.
  • Název události: Název události, která se má odeslat.
  • Data události: JSON serializovatelná datová část k odeslání do instance.
Izolovaný model pracovního procesu
[Function("RaiseEvent")]
public static Task Run(
    [DurableClient] DurableTaskClient client,
    [QueueTrigger("event-queue")] string instanceId)
{
    int[] eventData = new int[] { 1, 2, 3 };
    return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}

Model v probíhajícím procesu
[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);
}

using Microsoft.DurableTask.Client;

int[] eventData = new int[] { 1, 2, 3 };
await client.RaiseEventAsync(instanceId, "MyEvent", eventData);

Poznámka:

Pokud neexistuje žádná instance orchestrace se zadaným ID instance, zpráva události se zahodí. Pokud instance existuje, ale ještě nečeká na událost, uloží se událost do stavu instance, dokud nebude připravená k přijetí a zpracování.

Čekání na dokončení orchestrace

V případě dlouhotrvajících orchestrací můžete chtít počkat na výsledky orchestrace. V těchto případech je také užitečné definovat časový limit pro orchestrace. Pokud dojde k překročení časového limitu, vrátí se místo výsledků stav orchestrace.

Použijte API "čekání na dokončení nebo vytvoření odpovědi na stav" pro synchronní získání skutečného výstupu z orchestrace instance. Ve výchozím nastavení má tato metoda časový limit deset sekund a interval dotazování o jedné sekundě.

Tady je příklad funkce triggeru HTTP, která ukazuje, jak používat toto rozhraní API:

Izolovaný model pracovního procesu
[Function("HttpSyncStart")]
public static async Task<HttpResponseData> Run(
    [HttpTrigger(
        AuthorizationLevel.Function,
        "post",
        Route = "orchestrators/{functionName}/wait")] HttpRequestData request,
    [DurableClient] DurableTaskClient client,
    string functionName)
{
    string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(functionName);

    using var timeoutCancellation = new CancellationTokenSource(TimeSpan.FromSeconds(30));
    return await client.WaitForCompletionOrCreateCheckStatusResponseAsync(
        request,
        instanceId,
        timeoutCancellation.Token);
}

Model v probíhajícím procesu
// 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));
        }
    }
}

Sady SDK Durable Task poskytují metodu pro synchronní čekání na dokončení orchestrace.

using Microsoft.DurableTask.Client;

// Wait for orchestration to complete with a timeout
OrchestrationMetadata metadata = await client.WaitForInstanceCompletionAsync(
    instanceId,
    timeout: TimeSpan.FromSeconds(30),
    getInputsAndOutputs: true);

if (metadata.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
{
    Console.WriteLine($"Output: {metadata.SerializedOutput}");
}

Volejte funkci pomocí následujícího řádku. Pro časový limit použijte dva sekundy a interval opakování 0,5 sekund:

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

Poznámka:

Výše uvedený příkaz cURL předpokládá, že máte v projektu funkci orchestrátoru.E1_HelloSequence Vzhledem k tomu, jak je zapisována funkce triggeru HTTP, můžete ji nahradit názvem libovolné funkce orchestrátoru ve vašem projektu.

V závislosti na době potřebné k získání odpovědi z instance orchestrace existují dva případy:

  • Instance orchestrace jsou dokončeny v rámci definovaného časového limitu (v tomto případě dvě sekundy) a odpovědí je skutečný výstup z instance orchestrace, který je synchronně poskytován:
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!"
]
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}"
}

Poznámka:

Formát adres URL webhooku se může lišit v závislosti na tom, jakou verzi Azure Functions hostitele spustíte. Předchozí příklad je určený pro hostitele Azure Functions 3.0.

Načtení adres URL webhooku správy HTTP pro instance orchestrace

K monitorování nebo vyvolání událostí pro orchestraci použijte externí systém. Externí systémy komunikují s Durable Functions prostřednictvím adres URL webhooku, které jsou součástí výchozí odpovědi popsané v zjišťování adres URL rozhraní APIHTTP. Adresy URL webhooků jsou alternativně přístupné prostřednictvím kódu programu pomocí vazby klienta orchestrace. API pro vytvoření datové části správy HTTP specificky obdrží serializovatelný objekt, který obsahuje tyto URL adresy webhooků.

Rozhraní API pro vytvoření datové části správy HTTP má jeden parametr:

  • ID instance: Jedinečné ID instance.

Metody vrátí objekt s následujícími vlastnostmi řetězce:

  • ID: ID instance orchestrace (musí být stejné jako InstanceId vstup).
  • StatusQueryGetUri: Adresa URL stavu instance orchestrace.
  • SendEventPostUri: URL adresa orchestrace instance pro "vyvolání události".
  • TerminatePostUri: Adresa URL "terminate" instance orchestrace.
  • PurgeHistoryDeleteUri: Adresa URL "promazání historie" instance orchestrace.
  • SuspendPostUri: Adresa URL instance orchestrace pro "suspend".
  • ResumePostUri: URL adresa pro „resume“ instanci orchestrace.

Funkce odesílají instance těchto objektů externím systémům za účelem monitorování nebo vyvolání událostí v odpovídajících orchestracích, jak je znázorněno v následujících příkladech.

Izolovaný model pracovního procesu
[Function("SendInstanceInfo")]
[CosmosDBOutput(
    databaseName: "MonitorDB",
    containerName: "HttpManagementPayloads",
    Connection = "CosmosDBConnectionSetting")]
public static object SendInstanceInfo(
    [ActivityTrigger] TaskActivityContext context,
    [DurableClient] DurableTaskClient client)
{
    HttpManagementPayload payload = client.CreateHttpManagementPayload(context.InstanceId);

    // Send the payload to Azure Cosmos DB.
    return new { Payload = payload, id = context.InstanceId };
}

Model v probíhajícím procesu
[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 };
}

Převinout instance orchestrace zpět

Pokud dojde k selhání orchestrace z neočekávaného důvodu, resetujte instanci do předchozího funkčního stavu pomocí rozhraní API vytvořeného pro tento účel.

Poznámka:

Toto rozhraní API nemá být náhradou za správné zpracování chyb a zásady opakování. Místo toho se má použít pouze v případech, kdy instance orchestrace selžou z neočekávaných důvodů. Orchestrace v jiných stavech než Failed (například Running, Pending, Terminated nebo Completed) nemohou být "přetočeny". Další informace o zpracování chyb a zásadách opakování najdete v článku Zpracování chyb .

Pomocí metody RewindAsync (.NET) nebo rewind (JavaScript) vazby klienta orchestration přepněte orchestraci zpět do stavu Running. Tato metoda také znovu spustí provádění aktivity nebo suborchestrace, jejichž selhání způsobilo selhání orchestrace.

Řekněme například, že máte pracovní postup zahrnující řadu lidských schválení. Předpokládejme, že řada funkcí aktivit upozorní někoho, že je potřeba jejich schválení, a je potřeba počkat na odezvu v reálném čase. Jakmile všechny aktivity schválení obdrží odpovědi nebo vyprší časový limit, může dojít k selhání jiné aktivity kvůli chybné konfiguraci aplikace, například neplatnému připojovacímu řetězci databáze. Výsledkem je selhání orchestrace hluboko v pracovním postupu. S rozhraním API RewindAsync (.NET) nebo rewind (JavaScript) může správce aplikace opravit chybu konfigurace a vrátit neúspěšnou orchestraci do stavu těsně před selháním. Žádný z kroků pro lidskou interakci není potřeba znovu schválit a orchestrace se teď může úspěšně dokončit.

Poznámka:

Funkce převinutí neumožňuje převinutí instancí orchestrace, které používají trvalé časovače.

Izolovaný model pracovního procesu
[Function("RewindInstance")]
public static Task Run(
    [DurableClient] DurableTaskClient client,
    [QueueTrigger("rewind-queue")] string instanceId)
{
    string reason = "Orchestrator failed and needs to be revived.";
    return client.RewindInstanceAsync(instanceId, reason);
}

Model v probíhajícím procesu
[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);
}

using Microsoft.DurableTask.Client;

string reason = "Orchestrator failed and needs to be revived.";
await client.RewindInstanceAsync(instanceId, reason);

Restartování orchestračních instancí

Restartování orchestrace vytvoří novou instanci pomocí historie dříve spuštěné instance. Tato funkce je užitečná, když chcete znovu spustit orchestraci se stejným vzorem ID vstupu a instance a vytvořit nové spuštění založené na původním příkazu.

Izolovaný model pracovního procesu
[Function("RestartInstance")]
public static Task<string?> Run(
    [DurableClient] DurableTaskClient client,
    [QueueTrigger("restart-queue")] string instanceId)
{
    return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}

Model v probíhajícím procesu
[FunctionName("RestartInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("restart-queue")] string instanceId)
{
    return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}

using Microsoft.DurableTask.Client;

// Restart an orchestration with a new instance ID
string newInstanceId = await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: true);
Console.WriteLine($"Restarted as new instance: {newInstanceId}");

// Restart an orchestration keeping the same instance ID
await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: false);

Vymazání historie instancí orchestrace

Pokud chcete odebrat všechna data přidružená k orchestraci, vyprázdněte historii instancí. Odstraňte například všechny prostředky úložiště přidružené k dokončené instanci. Použijte rozhraní API vyprázdnění instance definované klientem orchestrace.

Následující příklad ukazuje, jak vyprázdnit jednu instanci orchestrace.

Izolovaný model pracovního procesu
[Function("PurgeInstanceHistory")]
public static async Task Run(
    [DurableClient] DurableTaskClient client,
    [QueueTrigger("purge-queue")] string instanceId)
{
    await client.PurgeInstanceAsync(instanceId);
}

Model v probíhajícím procesu
[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("purge-queue")] string instanceId)
{
    return client.PurgeInstanceHistoryAsync(instanceId);
}

using Microsoft.DurableTask.Client;

// Purge a single orchestration instance
PurgeResult result = await client.PurgeInstanceAsync(instanceId);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");

Následující příklad ukazuje funkci aktivovanou časovačem, která vymaže historii pro všechny instance orchestrace, které se dokončily po zadaném časovém intervalu. V tomto případě odebere data pro všechny instance dokončené před 30 nebo více dny. Tato ukázková funkce je naplánovaná tak, aby běžela jednou denně v 12:00 UTC:

Izolovaný model pracovního procesu
[Function("PurgeInstanceHistory")]
public static async Task Run(
    [DurableClient] DurableTaskClient client,
    [TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
    var filter = new PurgeInstancesFilter(
        CreatedFrom: DateTime.MinValue,
        CreatedTo: DateTime.UtcNow.AddDays(-30),
        Statuses: new[] { OrchestrationRuntimeStatus.Completed });

    await client.PurgeAllInstancesAsync(filter);
}

Model v probíhajícím procesu
[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
        });
}

using Microsoft.DurableTask.Client;

// Purge completed instances older than 30 days
var filter = new PurgeInstancesFilter(
    CreatedFrom: DateTime.MinValue,
    CreatedTo: DateTime.UtcNow.AddDays(-30),
    Statuses: new[] { OrchestrationRuntimeStatus.Completed });

PurgeResult result = await client.PurgeAllInstancesAsync(filter);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");

Poznámka:

Aby operace vyprázdnění historie proběhla úspěšně, stav běhu cílové instance musí být Dokončeno, Ukončeno nebo Neúspěšné.

Další kroky