Freigeben über


Funktionskette

Die Funktionskette ist ein Muster, bei dem Sie eine Sequenz von Funktionen in der reihenfolge ausführen. Es ist üblich, die Ausgabe einer Funktion an die Eingabe der nächsten zu übergeben. Dieser Artikel beschreibt die Verkettungssequenz, die Sie erstellen, wenn Sie das Quickstart Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell oder Java) abschließen. Weitere Informationen finden Sie in Durable Functions Overview.

Voraussetzungen

Die Funktionskette ist ein Muster, bei dem Sie eine Abfolge von Aktivitäten in der Reihenfolge ausführen. Es ist üblich, die Ausgabe einer Aktivität an die Eingabe der nächsten zu übergeben. In diesem Artikel wird die Verkettungssequenz für die sdKs für dauerhafte Aufgaben für .NET, JavaScript, Python und Java beschrieben.

Funktionen

In diesem Artikel werden diese Funktionen in der Beispiel-App beschrieben:

  • E1_HelloSequence: Eine Orchestratorfunktion , die mehrmals in Sequenz aufruft E1_SayHello . Es speichert jede Ausgabe und zeichnet die Ergebnisse auf.
  • E1_SayHello: Eine Aktivitätsfunktion , die "Hello" am Anfang einer Zeichenfolge hinzufügt.
  • HttpStart: Eine http-ausgelöste dauerhafte Clientfunktion , die eine Instanz des Orchestrators startet.

In diesem Artikel werden diese Komponenten in der Beispiel-App beschrieben:

  • GreetingOrchestration, greetingOrchestrator, , function_chaining_orchestratoroder ActivityChaining: Ein Orchestrator, der mehrere Aktivitäten in Sequenz aufruft. Es speichert jede Ausgabe und zeichnet die Ergebnisse auf.
  • Aktivitätsfunktionen: Aktivitäten, die Eingaben verarbeiten und Ergebnisse zurückgeben. Jede Aktivität führt eine einfache Transformation für die Eingabe durch.
  • Client: Eine Client-App, die eine Instanz des Orchestrators startet und auf das Ergebnis wartet.

Orchestrator

[FunctionName("E1_HelloSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello_DirectInput", "London"));

    // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
    return outputs;
}

Alle C#-Orchestrierungsfunktionen müssen über einen Parameter vom Typ DurableOrchestrationContext verfügen, der in der Assembly Microsoft.Azure.WebJobs.Extensions.DurableTask vorhanden ist. Mit diesem Kontextobjekt können Sie andere Funktionen vom Typ Aktivität aufrufen und Eingabeparameter mit der zugehörigen CallActivityAsync-Methode übergeben.

Im Code wird E1_SayHello dreimal nacheinander mit unterschiedlichen Parameterwerten aufgerufen. Der Rückgabewert jedes Aufrufs wird der Liste outputs hinzugefügt, die am Ende der Funktion zurückgegeben wird.

Dieser Code zeigt einen Orchestrator, der drei Aktivitäten sequenziert aufruft und jede Ausgabe an die nächste Aktivität übergibt:

using Microsoft.DurableTask;

[DurableTask]
public class GreetingOrchestration : TaskOrchestrator<string, string>
{
    public override async Task<string> RunAsync(TaskOrchestrationContext context, string name)
    {
        // Step 1: Say hello to the person
        string greeting = await context.CallActivityAsync<string>(nameof(SayHelloActivity), name);

        // Step 2: Process the greeting
        string processedGreeting = await context.CallActivityAsync<string>(nameof(ProcessGreetingActivity), greeting);

        // Step 3: Finalize the response
        string finalResponse = await context.CallActivityAsync<string>(nameof(FinalizeResponseActivity), processedGreeting);

        return finalResponse;
    }
}

Alle .NET Orchestratoren erben von TaskOrchestrator<TInput, TOutput>. TaskOrchestrationContext ermöglicht es Ihnen, Aktivitäten mit CallActivityAsync aufzurufen. Der Code ruft drei Aktivitäten in Sequenz auf, wobei jede Aktivität die Ausgabe der vorherigen Aktivität empfängt.

Aktivität

[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
    string name = context.GetInput<string>();
    return $"Hello {name}!";
}

Aktivitäten verwenden das ActivityTrigger-Attribut. Nutz IDurableActivityContext für Aktivitätsaktionen, wie zum Beispiel um Eingaben mit GetInput<T> zu lesen.

E1_SayHello formatiert eine Grußzeichenfolge.

Anstatt eine Bindung an IDurableActivityContext, binden Sie direkt an den Typ, der an die Aktivitätsfunktion übergeben wird. Beispiel:

[FunctionName("E1_SayHello_DirectInput")]
public static string SayHelloDirectInput([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}

Aktivitäten im Sdk für dauerhafte Aufgaben erben von TaskActivity<TInput, TOutput>:

using Microsoft.DurableTask;
using Microsoft.Extensions.Logging;

[DurableTask]
public class SayHelloActivity : TaskActivity<string, string>
{
    private readonly ILogger<SayHelloActivity> _logger;

    public SayHelloActivity(ILogger<SayHelloActivity> logger)
    {
        _logger = logger;
    }

    public override Task<string> RunAsync(TaskActivityContext context, string name)
    {
        _logger.LogInformation("Activity SayHello called with name: {Name}", name);
        return Task.FromResult($"Hello {name}!");
    }
}

[DurableTask]
public class ProcessGreetingActivity : TaskActivity<string, string>
{
    public override Task<string> RunAsync(TaskActivityContext context, string greeting)
    {
        return Task.FromResult($"{greeting} How are you today?");
    }
}

[DurableTask]
public class FinalizeResponseActivity : TaskActivity<string, string>
{
    public override Task<string> RunAsync(TaskActivityContext context, string response)
    {
        return Task.FromResult($"{response} I hope you're doing well!");
    }
}

Verwenden Sie die Abhängigkeitsinjektion, um Dienste wie diese ILogger zu erhalten. Fügen Sie das [DurableTask] Attribut hinzu, um die Aktivität beim Worker zu registrieren.

Kunde

Starten Sie eine Orchestrator-Funktionsinstanz aus einer Clientfunktion. Verwenden Sie die HttpStart HTTP-ausgelöste Funktion, um Instanzen von E1_HelloSequence zu starten.

public static class HttpStart
{
    [FunctionName("HttpStart")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}")] HttpRequestMessage req,
        [DurableClient] IDurableClient 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}'.");

        return starter.CreateCheckStatusResponse(req, instanceId);
    }
}

Um mit Orchestratoren zu interagieren, fügen Sie eine DurableClient Eingabebindung hinzu. Verwenden Sie den Client, um eine Orchestrierung zu starten und eine HTTP-Antwort zurückzugeben, die URLs enthält, um den Status der neuen Orchestrierung zu überprüfen.

Starten Sie eine Orchestrierung aus einer Clientanwendung. Der Client plant die Orchestrierung und kann auf den Abschluss warten.

using Microsoft.DurableTask.Client;

// Create the client
var client = DurableTaskClientBuilder.UseDurableTaskScheduler(connectionString).Build();

// Schedule a new orchestration instance
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
    nameof(GreetingOrchestration),
    input: "World");

Console.WriteLine($"Started orchestration with ID: {instanceId}");

// Wait for the orchestration to complete
OrchestrationMetadata result = await client.WaitForInstanceCompletionAsync(
    instanceId,
    getInputsAndOutputs: true);

Console.WriteLine($"Orchestration completed with result: {result.ReadOutputAs<string>()}");

Erstellen Sie die DurableTaskClient mithilfe einer Verbindungszeichenfolge für den dauerhaften Aufgabenplaner. Verwenden Sie ScheduleNewOrchestrationInstanceAsync, um eine Orchestrierung zu starten, und WaitForInstanceCompletionAsync, um auf den Abschluss zu warten.

Beispiel ausführen

Um die E1_HelloSequence Orchestrierung auszuführen, senden Sie diese HTTP POST-Anforderung an die HttpStart Funktion.

POST http://{host}/orchestrators/E1_HelloSequence

Hinweis

Der vorherige HTTP-Codeausschnitt geht davon aus, dass die host.json-Datei des Beispiels das Standardpräfix api/ aus allen HTTP-Triggerfunktions-URLs entfernt. Suchen Sie diese Konfiguration in der host.json Datei des Beispiels.

Wenn Sie z. B. das Beispiel in einer Funktions-App mit dem Namen myfunctionapp ausführen, ersetzen Sie {host} durch myfunctionapp.azurewebsites.net.

Die Anforderung gibt HTTP 202 zurück (der Übersichtlichkeit halber gekürzt):

HTTP/1.1 202 Accepted
Content-Length: 719
Content-Type: application/json; charset=utf-8
Location: http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

(...trimmed...)

Die Orchestrierungswarteschlangen werden in die Warteschlange gestellt und sofort gestartet. Verwenden Sie die URL im Location Header, um den Ausführungsstatus zu überprüfen.

GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

Die Antwort zeigt den Orchestrierungsstatus an. Da sie schnell abgeschlossen ist, befindet sich die Instanz häufig im Status "Abgeschlossen " und gibt eine Antwort wie folgt zurück (kürzend):

HTTP/1.1 200 OK
Content-Length: 179
Content-Type: application/json; charset=utf-8

{"runtimeStatus":"Completed","input":null,"output":["Hello Tokyo!","Hello Seattle!","Hello London!"],"createdTime":"2017-06-29T05:24:57Z","lastUpdatedTime":"2017-06-29T05:24:59Z"}

Die Instanz runtimeStatus ist abgeschlossen und output enthält das JSON-serialisierte Ergebnis der Orchestrator-Funktionsausführung.

Hinweis

Implementieren Sie ähnliche Startlogik für andere Triggertypen, wie z. B. queueTrigger, eventHubTrigger oder timerTrigger.

Überprüfen Sie die Funktionsausführungsprotokolle. Die E1_HelloSequence Funktion wird aufgrund des in der Orchestrierungszuverlässigkeit beschriebenen Wiedergabeverhaltens mehrmals gestartet und abgeschlossen. Wird jedoch E1_SayHello nur dreimal ausgeführt, da die Ausführungen der Aktivitätsfunktion nicht wiedergegeben werden.

Zum Ausführen des Beispiels benötigen Sie Folgendes:

  1. Starten Sie den Emulator für den dauerhaften Aufgabenplaner (für die lokale Entwicklung):

    docker run -d -p 8080:8080 -p 8082:8082 --name dts-emulator mcr.microsoft.com/dts/dts-emulator:latest
    
  2. Starten Sie den Worker , um den Orchestrator und die Aktivitäten zu registrieren.

  3. Führen Sie den Client aus, um eine Orchestrierung zu planen und auf das Ergebnis zu warten.

Die Clientausgabe zeigt das verkettete Orchestrierungsergebnis an:

Started orchestration with ID: abc123
Orchestration completed with result: "Hello World! How are you today? I hope you're doing well!"

Die Arbeitsprotokolle zeigen, dass jede Aktivität nacheinander ausgeführt wird und ihre Ausgabe an die nächste Aktivität übergibt.

Nächste Schritte

In diesem Beispiel wird eine einfache Funktionsketten-Orchestrierung veranschaulicht. Implementieren Sie als Nächstes das Fan-Out/Fan-In-Muster.

In diesem Beispiel wird eine einfache Funktionsketten-Orchestrierung veranschaulicht. Als Nächstes erkunden Sie weitere Muster.

Vollständige JavaScript SDK-Beispiele finden Sie in den JavaScript-SDK-Beispielen für dauerhafte Aufgaben.