Delen via


Functiekoppeling in Durable Functions - Voorbeeld van hello-reeks

Functiekoppeling verwijst naar het patroon van het uitvoeren van een reeks functies in een bepaalde volgorde. Vaak moet de uitvoer van een functie worden toegepast op de invoer van een andere functie. In dit artikel wordt de ketenreeks beschreven die u maakt wanneer u de quickstart Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell of Java) voltooit. Zie Durable Functions overzicht voor meer informatie over Durable Functions.

Vereisten

Notitie

Versie 4 van het Node.js programmeermodel voor Azure Functions is algemeen beschikbaar. Het nieuwe v4-model is ontworpen voor een flexibelere en intuĆÆtievere ervaring voor JavaScript- en TypeScript-ontwikkelaars. Meer informatie over de verschillen tussen v3 en v4 vindt u in de migratiehandleiding.

In de volgende codefragmenten geeft JavaScript (PM4) het programmeermodel V4 aan, de nieuwe ervaring.

De functies

In dit artikel worden de volgende functies in de voorbeeld-app uitgelegd:

E1_HelloSequence orchestratorfunctie

[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#-indelingsfuncties moeten een parameter van het type DurableOrchestrationContexthebben die aanwezig is in de Microsoft.Azure.WebJobs.Extensions.DurableTask assembly. Met dit contextobject kunt u andere activiteitsfuncties aanroepen en invoerparameters doorgeven met behulp van de CallActivityAsync bijbehorende methode.

De code roept E1_SayHello drie keer achter elkaar aan met verschillende parameterwaarden. De retourwaarde van elke aanroep wordt toegevoegd aan de outputs lijst, die wordt geretourneerd aan het einde van de functie.

E1_SayHello activiteitsfunctie

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

Activiteiten gebruiken het ActivityTrigger kenmerk. Gebruik de opgegeven IDurableActivityContext om activiteitengerelateerde acties uit te voeren, zoals toegang tot de invoerwaarde met behulp van GetInput<T>.

De implementatie van E1_SayHello is een relatief eenvoudige tekenreeksopmaakbewerking.

In plaats van te binden aan een IDurableActivityContext, kunt u rechtstreeks binden aan het type dat wordt doorgegeven aan de activiteitsfunctie. Bijvoorbeeld:

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

HttpStart-clientfunctie

U kunt een exemplaar van de orchestratorfunctie starten met behulp van een clientfunctie. U gebruikt de HttpStart door HTTP geactiveerde functie om exemplaren van E1_HelloSequencete 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);
    }
}

Als u wilt communiceren met orchestrators, moet de functie een DurableClient invoerbinding bevatten. U gebruikt de client om een indeling te starten. Het kan u ook helpen bij het retourneren van een HTTP-antwoord met URL's voor het controleren van de status van de nieuwe indeling.

De voorbeeldtoepassing uitvoeren

Als u de E1_HelloSequence indeling wilt uitvoeren, verzendt u de volgende HTTP POST-aanvraag naar de HttpStart functie.

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

Notitie

In het vorige HTTP-fragment wordt ervan uitgegaan dat er een vermelding in het host.json bestand is die het standaardvoorvoegsel api/ verwijdert uit alle URL's voor HTTP-triggerfuncties. U vindt de markeringen voor deze configuratie in het host.json bestand in de voorbeelden.

Als u bijvoorbeeld het voorbeeld uitvoert in een functie-app met de naam 'myfunctionapp', vervangt u {host} door 'myfunctionapp.azurewebsites.net'.

Het resultaat is een HTTP 202-antwoord, zoals dit (ingekort voor de beknoptheid):

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

Op dit moment wordt de indeling in de wachtrij geplaatst en wordt deze onmiddellijk uitgevoerd. De URL in de Location header kan worden gebruikt om de status van de uitvoering te controleren.

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

Het resultaat is de status van de indeling. Het wordt snel uitgevoerd en voltooid, zodat u deze ziet in de status Voltooid met een antwoord dat er als volgt uitziet (ingekort voor de beknoptheid):

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

Zoals u ziet, is de runtimeStatus van het exemplaar Voltooid en bevat het output JSON-geserialiseerde resultaat van de uitvoering van de orchestratorfunctie.

Notitie

U kunt vergelijkbare starterslogica implementeren voor andere triggertypen, zoals queueTrigger, eventHubTriggerof timerTrigger.

Bekijk de uitvoeringslogboeken van de functie. De E1_HelloSequence functie is meerdere keren gestart en voltooid vanwege het gedrag van opnieuw afspelen dat wordt beschreven in het onderwerp orchestration reliability . Aan de andere kant waren er slechts drie uitvoeringen van E1_SayHello , omdat deze functie-uitvoeringen niet opnieuw worden afgespeeld.

Volgende stappen

In dit voorbeeld is een eenvoudige indeling voor functiekoppeling aangetoond. In het volgende voorbeeld ziet u hoe u het patroon voor uitwaaieren/inwaaieren implementeert.