Řetězení funkcí v Durable Functions – ukázka sekvence Hello

Řetězení funkcí označuje vzor provádění posloupnosti funkcí v určitém pořadí. Výstup jedné funkce je často potřeba použít na vstup jiné funkce. Tento článek popisuje posloupnost řetězení, kterou vytvoříte při dokončení Durable Functions rychlého startu (C#, JavaScript, TypeScript, Python, PowerShell nebo Java). Další informace o Durable Functions najdete v přehledu Durable Functions.

Požadavky

Poznámka

Verze 4 programovacího modelu Node.js pro Azure Functions je obecně dostupná. Nový model v4 je navržený tak, aby měl flexibilnější a intuitivnější prostředí pro vývojáře v JavaScriptu a TypeScriptu. Další informace o rozdílech mezi verzemi v3 a v4 najdete v průvodci migrací.

V následujících fragmentech kódu označuje JavaScript (PM4) programovací model V4, nové prostředí.

Funkce

Tento článek vysvětluje následující funkce v ukázkové aplikaci:

  • E1_HelloSequence: Funkce orchestrátoru , která volá E1_SayHello vícekrát v sekvenci. Ukládá výstupy z E1_SayHello volání a zaznamenává výsledky.
  • E1_SayHello: Funkce aktivity , která předsadí řetězec s "Hello".
  • HttpStart: Funkce odolného klienta aktivovaná protokolem HTTP, která spouští instanci orchestrátoru.

E1_HelloSequence funkce orchestrátoru

[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 Microsoft.Azure.WebJobs.Extensions.DurableTask sestavení. Tento kontextový objekt umožňuje volat další funkce aktivit a předávat vstupní parametry pomocí své CallActivityAsync metody.

Kód volá E1_SayHello třikrát po sobě 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.

E1_SayHello funkce aktivity

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

Aktivity používají ActivityTrigger atribut . K provádění akcí souvisejících s aktivitami, jako je například přístup ke vstupní hodnotě pomocí GetInput<T>nástroje , použijte zadaný parametr IDurableActivityContext .

Implementace E1_SayHello je relativně triviální operace formátování řetězců.

Místo vazby na IDurableActivityContext, můžete vytvořit vazbu 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}!";
}

Funkce klienta HttpStart

Instanci funkce orchestrátoru můžete spustit pomocí klientské funkce. Ke spuštění instancí použijete HttpStart funkci aktivovanou protokolem E1_HelloSequenceHTTP.

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

K interakci s orchestrátory musí funkce obsahovat DurableClient vstupní vazbu. Pomocí klienta spustíte orchestraci. Může vám také pomoct vrátit odpověď HTTP obsahující adresy URL pro kontrolu stavu nové orchestrace.

Spuštění ukázky

Pokud chcete orchestraci spustit E1_HelloSequence , odešlete do HttpStart funkce následující požadavek HTTP POST.

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

Poznámka

Předchozí fragment kódu HTTP předpokládá, že v host.json souboru je položka, která ze všech adres URL aktivačních funkcí HTTP odebere výchozí api/ předponu. Značky pro tuto konfiguraci najdete v host.json souboru v ukázkách.

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

Výsledkem je odpověď HTTP 202, jako je tato (zkrácená pro stručnost):

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

V tomto okamžiku je orchestrace zařazena do fronty a začne se okamžitě spouštět. Adresu URL v hlavičce Location můžete použít ke kontrole stavu spuštění.

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

Výsledkem je stav orchestrace. Rychle se spustí a dokončí, takže se zobrazí ve stavu Dokončeno s odpovědí, která vypadá takto (zkráceně pro stručnost):

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

Jak vidíte, runtimeStatus instance je Dokončeno a output obsahuje serializovaný výsledek spuštění funkce orchestrátoru JSON.

Poznámka

Podobnou počáteční logiku můžete implementovat pro jiné typy triggerů, jako jsou queueTrigger, eventHubTriggernebo timerTrigger.

Podívejte se na protokoly provádění funkcí. Funkce se spustila E1_HelloSequence a dokončila několikrát kvůli chování přehrávání popsanému v tématu o spolehlivosti orchestrace . Na druhou stranu došlo pouze ke třem spuštěním E1_SayHello , protože tato spuštění funkcí se nepřehrávají.

Další kroky

Tato ukázka demonstrovala jednoduchou orchestraci zřetězení funkcí. Další ukázka ukazuje, jak implementovat model fan-out/fan-in.