Sdílet prostřednictvím


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

Řetězení funkcí odkazuje na vzor spuště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í rychlého startu Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell nebo Java). Další informace o Durable Functions naleznete v tématu Durable Functions přehled.

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 v3 a v4 najdete v průvodci migrací.

V následujících fragmentech kódu JavaScript (PM4) označuje 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 posloupnosti. Ukládá výstupy z E1_SayHello volání a zaznamenává výsledky.
  • E1_SayHello: Funkce aktivity, která předpendí řetězec s textem "Hello".
  • HttpStart: Funkce odolného klienta aktivovaná protokolem HTTP, která spouští instanci orchestrátoru.

funkce orchestrátoru E1_HelloSequence

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

funkce aktivity E1_SayHello

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

Aktivity používají ActivityTrigger atribut. Pomocí poskytnutého IDurableActivityContext kódu můžete provádět akce související s aktivitami, jako je například přístup ke vstupní hodnotě pomocí GetInput<T>.

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

Místo vazby na funkci IDurableActivityContextaktivity můžete vytvořit vazbu přímo na typ, který se předá 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. Použijete funkci aktivovanou protokolem HttpStart HTTP ke spuštění instancí 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);
    }
}

Aby funkce fungovala s orchestrátory, musí obsahovat DurableClient vstupní vazbu. Ke spuštění orchestrace použijete klienta. 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 existuje položka, která odebere výchozí api/ předponu ze všech adres URL aktivačních funkcí HTTP. 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} textem "myfunctionapp.azurewebsites.net".

Výsledkem je odpověď HTTP 202, jako je tato (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...)

V tomto okamžiku se orchestrace zařadí do fronty a začne se okamžitě spouštět. Adresu URL v Location hlavičce 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. Spustí se a dokončí se rychle, takže se zobrazí ve stavu Dokončeno s odpovědí, která vypadá takto (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"}

Jak vidíte, runtimeStatus instance je Dokončena a output obsahuje serializovaný výsledek funkce orchestratoru.

Poznámka:

Můžete implementovat podobnou počáteční logiku pro jiné typy triggerů, jako je queueTrigger, eventHubTriggernebo timerTrigger.

Podívejte se na protokoly spuštění funkce. 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 druhé straně došlo pouze ke třem spuštěním E1_SayHello , protože tyto provádění funkcí se nepřehrají.

Další kroky

Tato ukázka ukázala jednoduchou orchestraci zřetězení funkcí. Další ukázka ukazuje, jak implementovat vzor ventilátoru nebo ventilátoru.