Delen via


Functiekoppeling in Durable Functions - Hello-reeksvoorbeeld

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 ketenvolgorde beschreven die u maakt wanneer u de QuickStart voor Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell of Java) voltooit. Zie het overzicht van Durable Functions 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 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: Een orchestratorfunctie die meerdere keren in een reeks aanroept E1_SayHello . Hiermee worden de uitvoer van de E1_SayHello aanroepen opgeslagen en worden de resultaten vastgelegd.
  • E1_SayHello: Een activiteitsfunctie die een tekenreeks voorbereidt met 'Hallo'.
  • HttpStart: Een door HTTP geactiveerde durable client-functie waarmee een exemplaar van de orchestrator wordt gestart.

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

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

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 opdracht om activiteitengerelateerde acties uit te voeren, zoals toegang tot de invoerwaarde met behulp van GetInput<T>.

De implementatie van E1_SayHello is een relatief triviale tekenreeksopmaakbewerking.

In plaats van een binding met een IDurableActivityContext, kunt u rechtstreeks verbinden met het type dat wordt doorgegeven aan de activiteitsfunctie. Voorbeeld:

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

HttpStart-clientfunctie

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

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

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 host.json vorige HTTP-fragment wordt ervan uitgegaan dat het bestand een vermelding bevat waarmee het standaardvoorvoegsel api/ wordt verwijderd uit alle URL's van HTTP-triggerfuncties. U vindt de opmaak 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 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 uitgevoerd en wordt snel voltooid, zodat u deze in de status Voltooid ziet met een antwoord dat er als volgt uitziet (ingekort voor 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 het runtimeStatus 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 gestart en meerdere keren voltooid vanwege het gedrag van opnieuw afspelen dat wordt beschreven in het onderwerp betrouwbaarheid van indelingen. Aan de andere kant waren er slechts drie uitvoeringen E1_SayHello van omdat deze functie-uitvoeringen niet opnieuw worden afgespeeld.

Volgende stappen

In dit voorbeeld is een eenvoudige indeling voor functiekoppelingen gedemonstreerd. In het volgende voorbeeld ziet u hoe u het fan-out-/fan-in-patroon implementeert.