Delen via


Functiekoppeling

Functiekoppeling is een patroon waarin u een reeks functies in volgorde uitvoert. Het is gebruikelijk om de uitvoer van een functie door te geven aan de invoer van de volgende. In dit artikel wordt de ketenreeks beschreven die u bouwt wanneer u de quickstart voor Durable Functions (C#, JavaScript voltooit, TypeScript, Python, PowerShell of Java). Meer informatie vindt u in het overzicht van Durable Functions.

Vereisten

Functiekoppeling is een patroon waarbij u een reeks activiteiten op volgorde uitvoert. Het is gebruikelijk om de uitvoer van één activiteit door te geven aan de invoer van de volgende. In dit artikel wordt de ketenvolgorde beschreven voor de Durable Task SDK's voor .NET, JavaScript, Python en Java.

Functies

In dit artikel worden deze functies in de voorbeeld-app beschreven:

  • E1_HelloSequence: Een orchestratorfunctie die meerdere keren op volgorde aanroept E1_SayHello . Elke uitvoer wordt opgeslagen en de resultaten worden vastgelegd.
  • E1_SayHello: Een activiteitsfunctie waarmee 'Hallo' wordt toegevoegd aan het begin van een tekenreeks.
  • HttpStart: Een door HTTP geactiveerde duurzame clientfunctie waarmee een exemplaar van de orchestrator wordt gestart.

In dit artikel worden deze onderdelen in de voorbeeld-app beschreven:

  • GreetingOrchestration, greetingOrchestrator, function_chaining_orchestratorof ActivityChaining: een orchestrator die meerdere activiteiten op volgorde aanroept. Elke uitvoer wordt opgeslagen en de resultaten worden vastgelegd.
  • Activiteitsfuncties: activiteiten die invoer verwerken en resultaten retourneren. Elke activiteit voert een eenvoudige transformatie uit op de invoer.
  • Client: Een client-app die een exemplaar van de orchestrator start en wacht op het resultaat.

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#-indelingsfuncties moeten een parameter van het type DurableOrchestrationContext hebben, die aanwezig is in de assembly Microsoft.Azure.WebJobs.Extensions.DurableTask. 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.

Deze code toont een orchestrator die drie activiteiten op volgorde aanroept en elke uitvoer doorgeeft aan de volgende activiteit:

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 orchestrators nemen over van TaskOrchestrator<TInput, TOutput>. Hiermee TaskOrchestrationContext kunt u activiteiten aanroepen met behulp van CallActivityAsync. De code roept drie activiteiten op volgorde aan, waarbij elke activiteit de uitvoer van de vorige activiteit ontvangt.

Activity

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

Activiteiten gebruiken het ActivityTrigger kenmerk. Gebruiken IDurableActivityContext voor activiteitsacties, zoals het lezen van invoer met GetInput<T>.

E1_SayHello formatteert een begroetingsreeks.

In plaats van een binding op IDurableActivityContext toe te passen, bind rechtstreeks aan het type dat is doorgegeven aan de activiteitsfunctie. Voorbeeld:

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

Activiteiten in de Durable Task SDK nemen over van 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!");
    }
}

Gebruik afhankelijkheidsinjectie om services zoals ILogger. Voeg het [DurableTask] kenmerk toe om de activiteit te registreren bij de worker.

Client

Start een orchestratorfunctie-exemplaar vanuit een clientfunctie. Gebruik de HttpStart HTTP-geactiveerde functie om exemplaren van E1_HelloSequence te 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, voegt u een DurableClient invoerbinding toe. Gebruik de client om een orchestratie te starten en een HTTP-antwoord te retourneren dat URL's bevat waarmee u de status van de nieuwe orchestratie kunt controleren.

Start een orchestratie vanuit een client-applicatie. De klant plant de orchestratie en kan wachten op voltooiing.

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

Maak de DurableTaskClient met behulp van een verbindingsreeks naar de Durable Task Scheduler. Gebruik ScheduleNewOrchestrationInstanceAsync om een orkestratie te starten en WaitForInstanceCompletionAsync om te wachten op voltooiing.

De voorbeeldtoepassing uitvoeren

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

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

Notitie

In het vorige HTTP-fragment wordt ervan uitgegaan dat het host.json bestand van het voorbeeld het standaardvoorvoegsel api/ verwijdert uit alle URL's van de HTTP-triggerfunctie. Zoek deze configuratie in het host.json-bestand van het voorbeeld.

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

De aanvraag retourneert HTTP 202 (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...)

De orkestratie wordt in de wachtrij geplaatst en direct gestart. Gebruik de URL in de header om de Location uitvoeringsstatus te controleren.

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

Het antwoord toont de orchestratiestatus. Omdat het snel is voltooid, bevindt het exemplaar zich vaak in de status Voltooid en retourneert een antwoord zoals dit (afgekapt 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"}

Het exemplaar runtimeStatus is voltooid en output bevat het JSON-geserialiseerde resultaat van de uitvoering van de orchestratorfunctie.

Notitie

Implementeer vergelijkbare starterslogica voor andere triggertypen, zoals queueTrigger, eventHubTriggerof timerTrigger.

Bekijk de uitvoeringslogboeken van de functie. De E1_HelloSequence functie start en voltooit meerdere keren vanwege het herhalingsgedrag dat wordt beschreven in orkestratiebetrouwbaarheid. Maar E1_SayHello wordt slechts drie keer uitgevoerd omdat uitvoeringen van activiteitsfuncties niet opnieuw worden afgespeeld.

Als u het voorbeeld wilt uitvoeren, hebt u het volgende nodig:

  1. Start de Durable Task Scheduler-emulator (voor lokale ontwikkeling):

    docker run -d -p 8080:8080 -p 8082:8082 --name dts-emulator mcr.microsoft.com/dts/dts-emulator:latest
    
  2. Start de worker om de orkestrator en activiteiten te registreren.

  3. Voer de client uit om een orkestratie te plannen en wacht op het resultaat.

De clientuitvoer toont het resultaat van de geketende orkestratie.

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

In de werklogboeken wordt elke activiteit op volgorde uitgevoerd en wordt de uitvoer doorgegeven aan de volgende activiteit.

Volgende stappen

In dit voorbeeld ziet u een eenvoudige indeling voor functiekoppelingen. Implementeer vervolgens het fan-out/fan-in patroon.

In dit voorbeeld ziet u een eenvoudige indeling voor functiekoppelingen. Verken vervolgens meer patronen.

Zie de Voorbeelden van de Durable Task JavaScript SDK voor volledige JavaScript SDK-voorbeelden.