Freigeben über


Funktionsverkettung in Durable Functions – „Hello Sequence“-Beispiel

Bei der Funktionsverkettung geht es um das Muster für die Ausführung einer Funktionssequenz in einer bestimmten Reihenfolge. Häufig muss die Ausgabe einer Funktion auf die Eingabe einer anderen Funktion angewendet werden. Dieser Artikel beschreibt die Verkettungssequenz, die Sie beim Durcharbeiten des Durable Functions-Schnellstarts (C#, JavaScript, TypeScript, Python, PowerShell oder Java) erstellen. Weitere Informationen zu Durable Functions finden Sie unter Übersicht zu Durable Functions.

Voraussetzungen

Hinweis

Version 4 des Node.js-Programmiermodells für Azure Functions ist allgemein verfügbar. Das neue v4-Modell ist für eine flexiblere und intuitivere Benutzeroberfläche für JavaScript- und TypeScript-Entwickler konzipiert. Weitere Informationen zu den Unterschieden zwischen v3 und v4 finden Sie im Migrationshandbuch.

In den folgenden Codeschnipseln steht JavaScript (PM4) für das Programmiermodell V4, die neue Erfahrung.

Die Funktionen

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

  • E1_HelloSequence: Eine Orchestratorfunktion, die E1_SayHello mehrmals hintereinander aufruft. Die Ausgaben der E1_SayHello-Aufrufe werden gespeichert, und die Ergebnisse werden aufgezeichnet.
  • E1_SayHello: Eine Aktivitätsfunktion, die einer Zeichenfolge das Wort „Hello“ voranstellt.
  • HttpStart: Eine durch HTTP ausgelöste Durable Client-Funktion, mit der eine Instanz der Orchestrierung gestartet wird.

Orchestratorfunktion „E1_HelloSequence“

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

Aktivitätsfunktion „E1_SayHello“

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

Aktivitäten verwenden das ActivityTrigger-Attribut. Verwenden Sie den bereitgestellten IDurableActivityContext, um aktivitätsbezogene Aktionen auszuführen, z. B. den Zugriff auf den Eingabewert mit GetInput<T>.

Die Implementierung von E1_SayHello ist ein relativ einfacher Zeichenfolgen-Formatierungsvorgang.

Anstatt an einen IDurableActivityContext zu binden, können Sie direkt an den Typ binden, der an die Aktivitätsfunktion übergeben wird. Beispiel:

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

Clientfunktion „HttpStart“

Sie können eine Instanz der Orchestratorfunktion mithilfe einer Clientfunktion starten. Sie verwenden die per HTTP ausgelöste HttpStart-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, muss die Funktion eine DurableClient-Eingabebindung enthalten. Mit dem Client starten Sie die Orchestrierung. Er kann Ihnen außerdem helfen, eine HTTP-Antwort zurückzugeben, die URLs zum Überprüfen des Status der neuen Orchestrierung enthält.

Ausführen des Beispiels

Senden Sie die folgende HTTP POST-Anforderung an die HttpStart-Funktion, um die E1_HelloSequence-Orchestrierung auszuführen.

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

Hinweis

Im vorherigen HTTP-Ausschnitt wird davon ausgegangen, dass ein Eintrag in der Datei host.json vorhanden ist, der das Standardpräfix api/ aus den URLs aller HTTP-Triggerfunktionen entfernt. Sie finden das Markup für diese Konfiguration in der Datei host.json in den Beispielen.

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

Das Ergebnis ist eine HTTP 202-Antwort, die wie folgt aussehen kann (hier 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...)

An diesem Punkt wird die Orchestrierung in die Warteschlange eingereiht und sofort ausgeführt. Die URL im Header Location kann verwendet werden, um den Status der Ausführung zu überprüfen.

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

Das Ergebnis ist der Status der Orchestrierung. Die Ausführung und der Abschluss werden schnell durchgeführt, sodass Sie den Status Completed (Abgeschlossen) mit dieser Antwort sehen (hier gekürzt):

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

Sie sehen, dass das runtimeStatus-Element der Instanz Completed lautet und dass output das per JSON serialisierte Ergebnis der Ausführung der Orchestratorfunktion enthält.

Hinweis

Sie können eine ähnliche Startlogik auch für andere Triggertypen wie queueTrigger, eventHubTrigger oder timerTrigger implementieren.

Sehen Sie sich die Protokolle zur Funktionsausführung an. Die Funktion E1_HelloSequence wurde mehrmals gestartet und abgeschlossen. Dies liegt am Wiedergabeverhalten, das im Thema Orchestrierungszuverlässigkeit beschrieben wird. Andererseits ist es nur zu drei Ausführungen von E1_SayHello gekommen, da diese Funktionsausführungen nicht wiedergegeben werden.

Nächste Schritte

In diesem Beispiel wird eine einfache Funktionsverkettungsorchestrierung veranschaulicht. Im nächsten Beispiel wird die Implementierung des Musters „Auffächern nach außen/innen“ gezeigt.