Sdílet prostřednictvím


Řetězení funkcí

Řetězení funkcí je vzor, ve kterém spouštíte posloupnost funkcí v uvedeném pořadí. Je běžné předat výstup jedné funkce do vstupu další. Tento článek popisuje posloupnost řetězení, kterou vytvoříte po dokončení rychlého startu Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell nebo Java). Další informace najdete v přehledu Durable Functions.

Požadavky

Řetězení funkcí je vzor, ve kterém spouštíte řadu činností ve stanoveném pořadí. Výstup jedné aktivity se běžně předává vstupu další aktivity. Tento článek popisuje řetězení pro sady SDK pro Durable Task u .NET, JavaScript, Python a Java.

Functions

Tento článek popisuje tyto funkce v ukázkové aplikaci:

  • E1_HelloSequence: Funkce orchestrátoru , která volá E1_SayHello vícekrát v sekvenci. Ukládá každý výstup a zaznamenává výsledky.
  • E1_SayHello: Funkce aktivity, která přidává "Hello" na začátek řetězce.
  • HttpStart: Odolná klientská funkce aktivovaná protokolem HTTP, která spouští instanci orchestrátoru.

Tento článek popisuje tyto komponenty v ukázkové aplikaci:

  • GreetingOrchestration, greetingOrchestrator, function_chaining_orchestratornebo ActivityChaining: Orchestrátor, který volá více aktivit v posloupnosti. Ukládá každý výstup a zaznamenává výsledky.
  • Funkce aktivit: Aktivity, které zpracovávají vstup a vracejí výsledky. Každá aktivita provádí jednoduchou transformaci vstupu.
  • Klient: Klientská aplikace, která spouští instanci orchestrátoru a čeká na výsledek.

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

Všechny funkce orchestrace jazyka C# musí mít parametr typu DurableOrchestrationContext, který existuje v sestavení Microsoft.Azure.WebJobs.Extensions.DurableTask. Tento kontextový objekt umožňuje volat jiné funkce aktivity a předávat vstupní parametry pomocí jeho CallActivityAsync metody.

Kód volá E1_SayHello třikrát v sekvenci s různými hodnotami parametrů. Návratová hodnota každého volání se přidá do outputs seznamu, který se vrátí na konci funkce.

Tento kód zobrazuje orchestrátor, který volá tři aktivity v posloupnosti a předává každý výstup další aktivitě:

using System.Threading.Tasks;
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;
    }
}

Všechny orchestrátory .NET dědí z TaskOrchestrator<TInput, TOutput>. TaskOrchestrationContext vám umožňuje volat aktivity pomocí CallActivityAsync. Kód volá tři aktivity v posloupnosti, kde každá aktivita přijímá výstup předchozí aktivity.

Activity

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

Aktivity používají ActivityTrigger atribut. Použijte IDurableActivityContext pro akce aktivit, jako je čtení vstupu pomocí GetInput<T>.

E1_SayHello formátuje řetězec pozdravu.

Místo vazby na IDurableActivityContext, navázat přímo na typ, který je předán do funkce aktivity. Příklad:

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

Aktivity v sadě Durable Task SDK dědí z TaskActivity<TInput, TOutput>:

using System.Threading.Tasks;
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!");
    }
}

Použijte injekci závislostí k získání služeb, jako je ILogger. Přidejte atribut [DurableTask] pro registraci aktivity u pracovníka.

Klient

Spusťte instanci funkce orchestrátoru z klientské funkce. HttpStart Ke spuštění instancí E1_HelloSequencepoužijte funkci aktivovanou protokolem HTTP .

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

Pokud chcete pracovat s orchestrátory, přidejte DurableClient vstupní vazbu. Pomocí klienta spusťte orchestraci a vraťte odpověď HTTP, která obsahuje adresy URL ke kontrole stavu nové orchestrace.

Spusťte orchestraci z klientské aplikace. Klient naplánuje orchestraci a může počkat na dokončení.

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

Vytvořte DurableTaskClient pomocí připojovacího řetězce pro plánovač trvalých úloh. Slouží ScheduleNewOrchestrationInstanceAsync k zahájení orchestrace a WaitForInstanceCompletionAsync čekání na dokončení.

Spusťte ukázku

Chcete-li spustit orchestraci E1_HelloSequence, odešlete tento požadavek HTTP POST do funkce HttpStart.

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

Poznámka:

Předchozí fragment kódu HTTP předpokládá, že soubor host.json ze vzorku odebere výchozí api/ předponu ze všech URL adres funkce spouštěče HTTP. Tuto konfiguraci najdete v ukázkovém souboruhost.json .

Pokud například spouštíte ukázku v aplikaci s funkcemi s názvem myfunctionapp, nahraďte {host} za myfunctionapp.azurewebsites.net.

Požadavek vrátí http 202 (zkrácený kvůli stručnosti):

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

Orchestrace fronty se spustí okamžitě. Pomocí adresy URL v Location záhlaví zkontrolujte stav spuštění.

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

Odpověď zobrazuje stav orchestrace. Vzhledem k tomu, že se instance rychle dokončí, je často ve stavu Dokončeno a vrací odpověď, jako je tato (zkrácená kvůli stručnosti):

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

Instance runtimeStatus je dokončena a output obsahuje serializovaný výsledek funkce orchestratoru.

Poznámka:

Implementujte podobnou počáteční logiku pro jiné typy triggerů, například queueTrigger, eventHubTriggernebo timerTrigger.

Zkontrolujte protokoly spuštění funkce. Funkce E1_HelloSequence se spustí a dokončí několikrát z důvodu chování přehrávání popsaného ve spolehlivosti orchestrace. Ale E1_SayHello se spustí pouze třikrát, protože provádění funkcí aktivity se neprovádí znovu.

Pokud chcete ukázku spustit, potřebujete:

  1. Spusťte emulátor plánovače úloh Durable (pro místní vývoj):

    docker run -d -p 8080:8080 -p 8082:8082 --name dts-emulator mcr.microsoft.com/dts/dts-emulator:latest
    
  2. Spusťte pracovní proces ke zaregistrování orchestrátoru a aktivit.

  3. Spusťte klienta a naplánujte orchestraci, poté počkejte na výsledek.

Výstup klienta zobrazuje zřetězený výsledek orchestrace:

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

Protokoly pracovních procesů ukazují, že každá aktivita se spouští v posloupnosti a předává její výstup další aktivitě.

Další kroky

Tato ukázka demonstruje jednoduchou orchestraci propojení funkcí. Dále implementujte model fan-out/fan-in.

Tato ukázka demonstruje jednoduchou orchestraci propojení funkcí. Dále prozkoumejte další vzory.

Kompletní příklady JavaScript SDK najdete v příkladech Durable Task JavaScript SDK.