Orchestration példányok kezelése

A beépített példánykezelési API-k használatával elindíthatja, lekérdezheti, leállíthatja, felfüggesztheti, folytathatja és törölheti az orchestration példányokat a tartós munkafolyamatokban. A Durable Functionsorchestration klienskötés elérhetővé teszi ezeket az API-kat. A Durable Task SDK-kban ugyanazok a műveletek érhetők el az DurableTaskClient osztályon keresztül. Ez a cikk bemutatja, hogyan hajthat végre minden egyes példánykezelési műveletet kód példákkal mindkét platformon.

Jótanács

A Azure Durable Task Scheduler a Durable Functions és a Durable Task SDK-k számára is ajánlott háttérrendszer, amely teljes mértékben felügyelt, kiszolgáló nélküli felületet biztosít a tartós munkafolyamatok nagy léptékű futtatásához.

Példányok indítása

A vezénylési ügyfél start-new (vagy schedule-new) metódusa új vezénylési példányt indít el. Ez a metódus belsőleg egy üzenetet ír a konfigurált háttérrendszerbe (például a Durable Task Scheduler vagy a Azure Storage), majd visszaadja. Ez az üzenet aszinkron módon elindít egy folyamatvezérlési eljárást a megadott névvel.

Az új orchestrációs példány indításához szükséges paraméterek a következők:

  • Név: Az ütemezni kívánt vezénylő függvény neve.
  • Bemenet: Minden olyan JSON-szerializálható adat, amelyet a vezénylő függvény bemeneteként kell átadni.
  • InstanceId: (Nem kötelező) A példány egyedi azonosítója. Ha nem adja meg ezt a paramétert, a metódus véletlenszerű azonosítót használ.

Jótanács

Amikor csak lehetséges, használjon véletlenszerű azonosítót a példányazonosítóhoz. A véletlenszerű példányazonosítók segítenek egyenlő terheléselosztást biztosítani a vezénylő függvények több virtuális gépen való skálázása során. A nem véletlenszerűen generált példányazonosítók használatának megfelelő ideje az, amikor az azonosító külső forrásból származik, vagy amikor a singleton vezénylőmintát implementálja.

  • Név: Az ütemezni kívánt vezénylés neve.
  • Bemenet: Minden olyan JSON-szerializálható adat, amelyet a vezénylés bemeneteként kell átadni.
  • InstanceId: (Nem kötelező) A példány egyedi azonosítója. Ha nem adja meg ezt a paramétert, a metódus véletlenszerű azonosítót használ.

Jótanács

Amikor csak lehetséges, használjon véletlenszerű azonosítót a példányazonosítóhoz. A véletlenszerű példányazonosítók segítenek egyenlő terheléselosztást biztosítani a vezénylések több virtuális gépen való skálázásakor. A nem véletlenszerűen generált példányazonosítók használatának megfelelő ideje az, amikor az azonosító külső forrásból származik, vagy amikor a singleton vezénylőmintát implementálja.

A következő példafüggvény elindít egy új vezénylési példányt:

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

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

Fontos

A PowerShell Durable Task SDK jelenleg nem érhető el.

Az alábbi kód bemutatja, hogyan indíthat el egy új vezénylési példányt a Durable Task SDK-k használatával:

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

Lekérdezéspéldányok

Az új vezénylési példányok elindítása után valószínűleg le kell kérdeznie a futtatókörnyezet állapotát, hogy megtudja, futnak-e, befejezték-e vagy sikertelenek.

A vezénylési ügyfél get-status metódusa egy vezénylési példány állapotát adja vissza.

Paraméterként egy instanceId (kötelező), showHistory (nem kötelező), showHistoryOutput (nem kötelező) és showInput (nem kötelező) paramétert használ.

  • showHistory: Ha be van trueállítva, a válasz tartalmazza a végrehajtási előzményeket.
  • showHistoryOutput: Ha be van trueállítva, a végrehajtási előzmények tevékenységkimeneteket tartalmaznak.
  • showInput: Ha be van falseállítva, a válasz nem tartalmazza a függvény bemenetét. Az alapértelmezett érték a true.

A metódus a következő tulajdonságokkal rendelkező objektumot ad vissza:

  • Név: A vezénylő függvény neve.
  • InstanceId: A vezénylési példányazonosító (meg kell egyeznie a instanceId bemenet értékével).
  • CreatedTime: Az időpont, amikor az orchestrator függvény elindul.
  • LastUpdatedTime: Az időpont, amikor az orchestration utolsó ellenőrzőpontja történt.
  • Bemenet: A függvény bemenete JSON-értékként. Ez a mező nincs kitöltve, ha showInputfalse.
  • CustomStatus: Egyéni orkesztáció állapota JSON formátumban.
  • Kimenet: A függvény kimenete JSON-értékként (ha a függvény befejeződik). Ha a vezénylő függvény meghibásodik, ez a tulajdonság tartalmazza a hiba részleteit. Ha a vezénylő függvényt felfüggesztik vagy megszakítják, ez a tulajdonság tartalmazza a felfüggesztés vagy a megszüntetés okát (ha van ilyen).
  • RuntimeStatus: Az alábbi értékek egyike:
    • Függőben: A példány ütemezett, de még nem indult el.
    • Fut: A példány fut.
    • Befejezve: A folyamat normálisan befejeződött.
    • ContinuedAsNew: A példány új történelemmel indult újra. Ez az állapot átmeneti állapot.
    • Sikertelen: A példány hiba miatt meghiúsult.
    • Leállt: A példány hirtelen megállt.
    • Felfüggesztve: A példány jelenleg fel van függesztve, és később újra folytatható.
  • Előzmények: A vezénylés végrehajtási története. Ezt a mezőt csak akkor tölti ki a rendszer, ha showHistory be truevan állítva.
  • showHistory: Ha be van trueállítva, a válasz tartalmazza a végrehajtási előzményeket.
  • showHistoryOutput: Ha be van trueállítva, a végrehajtási előzmények tevékenységkimeneteket tartalmaznak.
  • showInput: Ha false be van állítva, a válasz nem fogja tartalmazni a vezénylés bemenetét. Az alapértelmezett érték a true.

A metódus a következő tulajdonságokkal rendelkező objektumot ad vissza:

  • Név: Az orchestration neve.
  • InstanceId: A vezénylési példányazonosító (meg kell egyeznie a instanceId bemenet értékével).
  • CreatedTime: Az az időpont, amikor a vezénylés elindul.
  • LastUpdatedTime: Az időpont, amikor az orchestration utolsó ellenőrzőpontja történt.
  • Bemenet: Az orkestráció bemenete JSON-értékként. Ez a mező nincs kitöltve, ha showInputfalse.
  • CustomStatus: Egyéni orkesztáció állapota JSON formátumban.
  • Kimenet: A vezénylés kimenete JSON-értékként (ha a vezénylés befejeződött). Ha a vezénylés sikertelen, ez a tulajdonság tartalmazza a hiba részleteit. Ha a vezénylés felfüggesztésre vagy megszakításra kerül, ez a tulajdonság tartalmazza a felfüggesztés vagy a megszüntetés okát (ha van ilyen).
  • RuntimeStatus: Az alábbi értékek egyike:
    • Függőben: A példány ütemezett, de még nem indult el.
    • Fut: A példány fut.
    • Befejezve: A folyamat normálisan befejeződött.
    • ContinuedAsNew: A példány új történelemmel indult újra. Ez az állapot átmeneti állapot.
    • Sikertelen: A példány hiba miatt meghiúsult.
    • Leállt: A példány hirtelen megállt.
    • Felfüggesztve: A példány jelenleg fel van függesztve, és később újra folytatható.
  • Előzmények: A vezénylés végrehajtási története. Ezt a mezőt csak akkor tölti ki a rendszer, ha showHistory be truevan állítva.

Megjegyzés:

A vezénylő nincs megjelölve Completed, amíg az összes ütemezett feladat be nem fejeződik és a vezénylő visszatér. Más szóval, nem elegendő, ha egy orchesztrátor eléri a return állapotát ahhoz, hogy Completed-ként legyen jelölve. Ez különösen fontos a használatban lévő esetekben WhenAny ; ezek a vezénylők gyakran return az összes ütemezett feladat végrehajtása előtt.

Ez a metódus null (.NET és Java), undefined (JavaScript) vagy None (Python) értéket ad vissza, ha a példány nem létezik.

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

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

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
}

Az összes orchestration példány lekérdezése

A nyelvi SDK API-kkal lekérdezheti a feladatközpont összes vezénylési példányának állapotát. Ez a "list-instances" vagy "get-status" API a lekérdezési paramétereknek megfelelő orchestration példányokat képviselő objektumok listáját adja vissza.

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

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

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

Orchestration példányok lekérdezése szűrőkkel

Mi a teendő, ha nincs szüksége minden olyan információra, amelyet egy standard példány lekérdezése biztosít? Például, mi van akkor, ha csak az orchestration létrehozási ideje vagy az orchestration futásidejű állapota érdekli? A lekérdezés szűkítése szűrők alkalmazásával.

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

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

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

Orchesztrációs példányok megszüntetése

Ha olyan vezénylési példánya van, amely túl sokáig tart a futtatáshoz, vagy le kell állítania, mielőtt bármilyen okból befejeződik, befejezheti.

A megszakítási API két paramétere egy példányazonosító és egy oksztring , amely naplókba és a példány állapotára ír.

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

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

using Microsoft.DurableTask.Client;

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

A leállított példány végül áttér egy adott állapotba Terminated. De ez a változás nem történik meg azonnal. A leállítási művelet inkább a feladatközpontban lesz várólistára állítva, valamint az adott példány egyéb műveleteivel együtt. A példány lekérdezési API-kkal megtudhatja, hogy egy leállított példány mikor érte el ténylegesen az állapotot Terminated .

Megjegyzés:

A példánymegszüntetés jelenleg nem terjed tovább. A tevékenységfüggvények és az alvezénylések befejeződnek, függetlenül attól, hogy befejezi-e az őket nevező vezénylési példányt.

Orkesztációs példányok felfüggesztése és újraindítása

A vezénylés felfüggesztése lehetővé teszi a futó vezénylés leállítását. Az orkesztráció befejezésével ellentétben utólag folytathatja a felfüggesztett orkesztrátort.

A felfüggesztési API két paramétere egy példányazonosító és egy indoklás szöveg, amelyeket a rendszer naplókba és a példány státuszába rögzít.

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

A felfüggesztett példány végül átáll a Suspended állapotba. Azonban ez az átmenet nem történik meg azonnal. Ehelyett a felfüggesztési művelet várólistára kerül a feladatközpontban az adott példány egyéb műveleteivel együtt. A példány lekérdezési API-kkal megtudhatja, hogy egy futó példány ténylegesen elérte-e az állapotot Suspended .

Amikor egy felfüggesztett vezénylő folytatódik, az állapota visszaáll Running értékre.

Események küldése példányokra

Bizonyos esetekben a vezénylő függvényeknek várniuk és figyelniük kell a külső eseményeket. Ilyenek például a monitorozási és az emberi interakciós forgatókönyvek.

Bizonyos esetekben az orchestrationoknak várniuk kell, és figyelniük kell a külső eseményeket. Ilyenek például a monitorozási és az emberi interakciós forgatókönyvek.

Eseményértesítéseket küldhet a futó példányoknak az orchestration kliens esemény indítása API-jának használatával. Az orchestrációk a külső esemény várakoztatása API használatával meghallgathatják és megválaszolhatják ezeket az eseményeket.

A emelésesemény paraméterei a következők:

  • Példányazonosító: A példány egyedi azonosítója.
  • Esemény neve: A küldendő esemény neve.
  • Eseményadatok: JSON-szerializálható adatcsomag, amely a példánynak küldhető.
[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);
}

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

using Microsoft.DurableTask.Client;

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

Megjegyzés:

Ha nincs összhangolási példány a megadott példányazonosítóval, az eseményüzenet elvetésre kerül. Ha egy példány létezik, de még nem várja meg az eseményt, az esemény a példány állapotában lesz tárolva, amíg készen nem áll a fogadásra és a feldolgozásra.

Várakozás a vezénylés befejezésére

Hosszú ideig futó vezénylés esetén érdemes megvárni és lekérni a vezénylés eredményét. Ezekben az esetekben hasznos egy időtúllépési korlátot meghatározni az orchestráción. Ha lejár az időkorlát, az eredmények helyett az orchestráció állapotát adjuk vissza.

A "wait for completion or create check status response" API-val szinkron módon lekérheti egy orchestration instance tényleges kimenetét. Ez a módszer alapértelmezés szerint tíz másodperces időtúllépéssel és egy másodperces lekérdezési időközzel rendelkezik.

Íme egy példa HTTP-trigger függvényre, amely bemutatja, hogyan használhatja ezt az API-t:

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

A Durable Task SDK-k olyan módszert biztosítanak, amely megvárja, amíg a vezénylés szinkron módon befejeződik.

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

Hívja meg a függvényt a következő sor használatával. Az időtúllépéshez használjon két másodpercet, az újrapróbálkozási időközhöz pedig 0,5 másodpercet:

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

Megjegyzés:

A fenti cURL-parancs feltételezi, hogy van egy E1_HelloSequence elnevezésű vezénylő függvény a projektjében. Az HTTP-eseményindító függvény megírásának módja lehetővé teszi, hogy bármelyik vezénylő függvény nevét felhasználja a projektben.

Az orchestration példány válaszának megérkezéséhez szükséges idő függvényében két lehetőség van:

  • Az orchestration példányok a megadott időkorláton belül fejeződnek be (ebben az esetben két másodperc), és a válasz az orchestration példány tényleges kimenete, amely szinkron módon kerül kézbesítésre.
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!"
]
  • Orchestrációs példányok nem tudnak befejeződni a meghatározott időkorláton belül, és a válasz a HTTP API URL-felderítésben ismertetett alapértelmezett válasz:
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}"
}

Megjegyzés:

A webhook URL-címeinek formátuma eltérhet attól függően, hogy melyik verziójú Azure Functions-gazdagépet futtatja. Az előző példa az Azure Functions 3.0-gazdagépre mutat.

HTTP-felügyeleti webhook URL-címek lekérése vezénylési példányokhoz

Külső rendszer használata események figyelésére vagy vezénylésére. A külső rendszerek a Durable Functions webhook URL-címein keresztül kommunikálnak, amelyek a HTTP API URL feltárásakor ismertetett alapértelmezett válasz részét képezik. A webhook URL-címei programozott módon is hozzáférhetők az orchestrációs klienskötés használatával. A HTTP kezelési hasznos adatok létrehozása API egy szerializálható objektumot kap, mely ezeket a webhook URL-címeket tartalmazza.

Az HTTP felügyeleti terhelés létrehozása API egy paraméterrel rendelkezik:

  • Példányazonosító: A példány egyedi azonosítója.

A metódusok a következő sztringtulajdonságokkal rendelkező objektumot adnak vissza:

  • Azonosító: Az orkesztráció példányazonosítója (a bemenettel InstanceId megegyezőnek kell lennie).
  • StatusQueryGetUri: Az orchestrációs példány állapot URL-címe.
  • SendEventPostUri: A vezénylési példány "esemény létrehozása" URL-címe.
  • TerminatePostUri: A vezénylési példány "befejezés" URL-címe.
  • PurgeHistoryDeleteUri: Az orchestration példány "törlési előzményeinek" URL-címe.
  • SuspendPostUri: Az orkesztációs példány "felfüggesztés" URL-címe.
  • ResumePostUri: A vezénylési példány "folytatás" URL-címe.

A függvények az objektumok példányait külső rendszereknek küldik, hogy figyeljék az eseményeket, vagy eseményeket generáljanak a megfelelő orchestrationökön, ahogyan az alábbi példákban is látható.

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

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClientIDurableActivityContexthasználja, és a Durable Functions bővítmény újabb verzióiban elavultként van megjelölve. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

Az orchestration példányok visszatekerése

Ha a vezénylési folyamat váratlan okok miatt meghibásodik, a példányt egy erre a célra létrehozott API használatával visszatekerheti egy korábbi hibátlan állapotba.

Megjegyzés:

Ez az API nem helyettesíti a megfelelő hibakezelési és újrapróbálkozési szabályzatokat. Ehelyett csak olyan esetekben használható, amikor a vezénylési példányok váratlan okokból meghiúsulnak. A nem Failed (például Running, , Pending, Terminatedvagy Completed) állapotban lévő vezénylések nem lehetnek "újrahangolva". A hibakezelési és újrapróbálkozési szabályzatokkal kapcsolatos további információkért tekintse meg a hibakezelési cikket.

Használja az RewindAsyncrewind (.NET) vagy (JavaScript) metódusát, hogy az orchestrációt visszahelyezze a Futtatás állapotba. Ez a módszer a vezénylési hibát okozó tevékenység- vagy alvezénylési végrehajtási hibákat is újra futtatja.

Tegyük fel például, hogy egy munkafolyamat több emberi jóváhagyást is magában foglal. Tegyük fel, hogy tevékenységfüggvények sorozata értesíti valakit arról, hogy jóváhagyásra van szükség, és várja meg a valós idejű választ. Miután az összes jóváhagyási tevékenység kap válaszokat vagy időtúllépésre kerül, tegyük fel, hogy egy másik tevékenység meghiúsul egy alkalmazás helytelen konfigurációból adódóan, például egy érvénytelen adatbázis kapcsolati karakterlánc miatt. Az eredmény egy orchestrációs hiba a folyamat mélyén. A RewindAsync (.NET) vagy rewind (JavaScript) API-val az alkalmazás rendszergazdája kijavíthatja a konfigurációs hibát, és visszatekerheti a sikertelen vezénylést közvetlenül a hiba előtt. Az emberi beavatkozás egyik lépését sem kell újra jóváhagyni, és a vezénylés sikeresen befejeződhet.

Megjegyzés:

A visszatekerés funkció nem támogatja a tartós időzítőket használó vezénylési példányok visszatekerését.

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

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

using Microsoft.DurableTask.Client;

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

Orchestration példányok újraindítása

A vezénylés újraindítása új példányt hoz létre egy korábban futtatott példány előzményei alapján. Ez a funkció akkor hasznos, ha ugyanazzal a bemeneti és példányazonosító-mintával szeretne újrakezdeni egy orchestration-t, az eredeti alapján új futtatást létrehozva.

[FunctionName("RestartInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("restart-queue")] string instanceId)
{
    return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

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

Orchestration példány előzményeinek törlése

Az orchestrationhoz kapcsolt összes adat eltávolításához törölje az instance előzményeket. Törölje például a befejezett példányhoz társított tárerőforrásokat. Használja az orchestration kliens által definiált purge instance API-t.

Az alábbi példa bemutatja, hogyan törölhet egy orchestration példányt.

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

Az alábbi példa egy időzítő által aktivált függvényt mutat be, amely törli azon vezénylési példányok előzményeit, amelyek a megadott időintervallum után fejeződtek be. Ebben az esetben eltávolítja a 30 vagy több nappal ezelőtt befejezett összes példány adatait. Ez a példafüggvény naponta egyszer, UTC 12:00-kor lesz futtatva:

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

Megjegyzés:

Az előző C#-kód a folyamaton belüli modellt IDurableOrchestrationClienthasználja, amely elavultként van megjelölve a Durable Functions bővítmény újabb verzióiban. Új .NET-projektek esetén fontolja meg a .NET izolált feldolgozói modellDurableTaskClienthasználatát. További információkért tekintse meg a Durable Functions-verziókról szóló cikket.

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

Megjegyzés:

Ahhoz, hogy a törlési előzményművelet sikeres legyen, a célpéldány futtatókörnyezeti állapotának befejezettnek, megszakítottnak vagy sikertelennek kell lennie.

Következő lépések