Udostępnij za pośrednictwem


Łączenie funkcji w Durable Functions — przykład sekwencji hello

Łączenie funkcji odnosi się do wzorca wykonywania sekwencji funkcji w określonej kolejności. Często dane wyjściowe jednej funkcji muszą być stosowane do danych wejściowych innej funkcji. W tym artykule opisano sekwencję tworzenia łańcucha utworzoną po ukończeniu przewodnika Szybki start Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell lub Java). Aby uzyskać więcej informacji na temat Durable Functions, zobacz omówienie Durable Functions.

Wymagania wstępne

Uwaga

Wersja 4 modelu programowania Node.js dla Azure Functions jest ogólnie dostępna. Nowy model w wersji 4 został zaprojektowany z myślą o bardziej elastycznym i intuicyjnym środowisku dla deweloperów języka JavaScript i TypeScript. Dowiedz się więcej o różnicach między wersjami 3 i 4 w przewodniku migracji.

W poniższych fragmentach kodu kod JavaScript (PM4) oznacza model programowania w wersji 4 , nowe środowisko.

Funkcje

W tym artykule wyjaśniono następujące funkcje w przykładowej aplikacji:

  • E1_HelloSequence: Funkcja orkiestratora , która wywołuje E1_SayHello wiele razy w sekwencji. Przechowuje dane wyjściowe z E1_SayHello wywołań i rejestruje wyniki.
  • E1_SayHello: funkcja działania , która poprzedza ciąg ciągiem "Hello".
  • HttpStart: funkcja klienta trwała wyzwalana przez protokół HTTP, która uruchamia wystąpienie orkiestratora.

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

Wszystkie funkcje orkiestracji języka C# muszą mieć parametr typu DurableOrchestrationContext, który istnieje w Microsoft.Azure.WebJobs.Extensions.DurableTask zestawie. Ten obiekt kontekstu umożliwia wywoływanie innych funkcji działania i przekazywanie parametrów wejściowych przy użyciu jego CallActivityAsync metody.

Kod wywołuje E1_SayHello trzy razy w sekwencji z różnymi wartościami parametrów. Zwracana wartość każdego wywołania jest dodawana do outputs listy, która jest zwracana na końcu funkcji.

funkcja działania E1_SayHello

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

Działania używają atrybutu ActivityTrigger . Użyj podanego IDurableActivityContext elementu , aby wykonać akcje związane z działaniami, takie jak uzyskiwanie dostępu do wartości wejściowej przy użyciu polecenia GetInput<T>.

E1_SayHello Implementacja to stosunkowo trywialna operacja formatowania ciągów.

Zamiast wiązać z elementem , można powiązać bezpośrednio z typem IDurableActivityContextprzekazywanym do funkcji działania. Na przykład:

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

HttpStart, funkcja klienta

Możesz uruchomić wystąpienie funkcji orkiestratora przy użyciu funkcji klienta. Użyjesz HttpStart funkcji wyzwalanej przez protokół HTTP, aby uruchomić wystąpienia programu 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 korzystać z orkiestratorów, funkcja musi zawierać DurableClient powiązanie wejściowe. Klient jest używany do uruchamiania aranżacji. Może również pomóc w zwracaniu odpowiedzi HTTP zawierającej adresy URL do sprawdzania stanu nowej aranżacji.

Uruchamianie aplikacji przykładowej

Aby wykonać E1_HelloSequence orkiestrację, wyślij następujące żądanie HTTP POST do HttpStart funkcji.

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

Uwaga

Poprzedni fragment kodu HTTP zakłada, że w host.json pliku znajduje się wpis, który usuwa domyślny api/ prefiks ze wszystkich adresów URL funkcji wyzwalacza HTTP. Znaczniki dla tej konfiguracji można znaleźć w pliku w host.json przykładach.

Jeśli na przykład używasz przykładu w aplikacji funkcji o nazwie "myfunctionapp", zastąp ciąg "{host}" ciągiem "myfunctionapp.azurewebsites.net".

Wynikiem jest odpowiedź HTTP 202, taka jak ta (przycięta do zwięzłości):

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

W tym momencie orkiestracja jest w kolejce i zaczyna działać natychmiast. Adres URL w nagłówku Location może służyć do sprawdzania stanu wykonania.

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

Wynikiem jest stan aranżacji. Jest uruchamiana i wykonywana szybko, więc zobaczysz ją w stanie Ukończono z odpowiedzią, która wygląda następująco (przycięta do zwięzłości):

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 widać, runtimeStatus element wystąpienia jest ukończony i output zawiera wynik serializacji JSON wykonania funkcji orkiestratora.

Uwaga

Podobną logikę początkową można zaimplementować dla innych typów wyzwalaczy, takich jak queueTrigger, lub eventHubTriggertimerTrigger.

Przyjrzyj się dziennikom wykonywania funkcji. Funkcja została uruchomiona E1_HelloSequence i ukończona wiele razy z powodu zachowania odtwarzania opisanego w temacie niezawodności orkiestracji . Z drugiej strony, było tylko trzy wykonania E1_SayHello , ponieważ te wykonania funkcji nie są odtwarzane.

Następne kroki

W tym przykładzie przedstawiono prostą aranżację łańcucha funkcji. W następnym przykładzie pokazano, jak zaimplementować wzorzec wentylatora/wentylatora.