Share via


Funktionslänkning i Durable Functions – Hello-sekvensexempel

Funktionslänkning refererar till mönstret för att köra en sekvens med funktioner i en viss ordning. Ofta måste utdata från en funktion tillämpas på indata för en annan funktion. Den här artikeln beskriver den länkningssekvens som du skapar när du slutför snabbstarten för Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell eller Java). Mer information om Durable Functions finns i Durable Functions översikt.

Förutsättningar

Anteckning

Version 4 av Node.js programmeringsmodell för Azure Functions är allmänt tillgänglig. Den nya v4-modellen är utformad för att ha en mer flexibel och intuitiv upplevelse för JavaScript- och TypeScript-utvecklare. Läs mer om skillnaderna mellan v3 och v4 i migreringsguiden.

I följande kodfragment anger JavaScript (PM4) programmeringsmodellen V4, den nya upplevelsen.

Funktionerna

Den här artikeln förklarar följande funktioner i exempelappen:

  • E1_HelloSequence: En orkestreringsfunktion som anropar E1_SayHello flera gånger i en sekvens. Den lagrar utdata från anropen E1_SayHello och registrerar resultatet.
  • E1_SayHello: En aktivitetsfunktion som förbereder en sträng med "Hello".
  • HttpStart: En HTTP-utlöst varaktig klientfunktion som startar en instans av orkestreraren.

E1_HelloSequence orchestrator-funktion

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

Alla C#-orkestreringsfunktioner måste ha en parameter av typen DurableOrchestrationContext, som finns i Microsoft.Azure.WebJobs.Extensions.DurableTask sammansättningen. Med det här kontextobjektet kan du anropa andra aktivitetsfunktioner och skicka indataparametrar med hjälp av dess CallActivityAsync -metod.

Koden anropar E1_SayHello tre gånger i följd med olika parametervärden. Returvärdet för varje anrop läggs till i outputs listan, som returneras i slutet av funktionen.

E1_SayHello aktivitetsfunktion

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

Aktiviteter använder attributet ActivityTrigger . Använd som tillhandahålls IDurableActivityContext för att utföra aktivitetsrelaterade åtgärder, till exempel åtkomst till indatavärdet med hjälp av GetInput<T>.

Implementeringen av E1_SayHello är en relativt trivial strängformateringsåtgärd.

I stället för att binda till en IDurableActivityContextkan du binda direkt till den typ som skickas till aktivitetsfunktionen. Exempel:

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

HttpStart-klientfunktion

Du kan starta en instans av orchestrator-funktionen med hjälp av en klientfunktion. Du kommer att använda den HttpStart HTTP-utlösta funktionen för att starta instanser av E1_HelloSequence.

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

Om du vill interagera med orkestrerare måste funktionen innehålla en DurableClient indatabindning. Du använder klienten för att starta en orkestrering. Det kan också hjälpa dig att returnera ett HTTP-svar som innehåller URL:er för att kontrollera status för den nya orkestreringen.

Kör exemplet

Skicka följande HTTP POST-begäran till HttpStart funktionen för att köra E1_HelloSequence orkestreringen.

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

Anteckning

Det tidigare HTTP-kodfragmentet förutsätter att det finns en post i host.json filen som tar bort standardprefixet api/ från alla URL:er för HTTP-utlösarfunktioner. Du hittar koden för den här konfigurationen host.json i filen i exemplen.

Om du till exempel kör exemplet i en funktionsapp med namnet "myfunctionapp" ersätter du "{host}" med "myfunctionapp.azurewebsites.net".

Resultatet är ett HTTP 202-svar, så här (trimmat för korthet):

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

Nu köas orkestreringen och börjar köras omedelbart. URL:en i Location rubriken kan användas för att kontrollera körningens status.

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

Resultatet är orkestreringens status. Den körs och slutförs snabbt, så du ser den i tillståndet Slutfört med ett svar som ser ut så här (trimmat för korthet):

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

Som du ser är instansen runtimeStatusSlutförd och output innehåller det JSON-serialiserade resultatet av orchestrator-funktionskörningen.

Anteckning

Du kan implementera liknande startlogik för andra utlösartyper, till exempel queueTrigger, eventHubTriggereller timerTrigger.

Titta på funktionskörningsloggarna. Funktionen E1_HelloSequence startades och slutfördes flera gånger på grund av återuppspelningsbeteendet som beskrivs i avsnittet om orkestreringstillförlitlighet . Å andra sidan fanns det bara tre körningar av E1_SayHello eftersom dessa funktionskörningar inte spelas upp igen.

Nästa steg

Det här exemplet har demonstrerat en enkel funktionslänkningsorkestrering. Nästa exempel visar hur du implementerar fan-out/fan-in-mönstret.