Łączenie łańcuchów funkcji w rozszerzeniu Durable Functions — przykładowa sekwencja Hello

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

Wymagania wstępne

Uwaga

Wersja 4 modelu programowania Node.js dla usługi 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ęzyków JavaScript i TypeScript. Dowiedz się więcej o różnicach między wersjami 3 i v4 w przewodniku migracji.

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

Funkcje

W tym artykule opisano 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 "Hello".
  • HttpStart: Funkcja klienta trwałego 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. Wartość zwracana 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 podanej IDurableActivityContext opcji, aby wykonać akcje związane z działaniem, takie jak uzyskiwanie dostępu do wartości wejściowej przy użyciu polecenia GetInput<T>.

Implementacja E1_SayHello jest stosunkowo trywialną operacją 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}!";
}

Funkcja klienta HttpStart

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 wchodzić w interakcje z orkiestratorami, funkcja musi zawierać DurableClient powiązanie wejściowe. Aby rozpocząć aranżację, należy użyć klienta. Może również pomóc zwrócić odpowiedź HTTP zawierającą adresy URL w celu sprawdzenia stanu nowej aranżacji.

Uruchamianie aplikacji przykładowej

Aby wykonać aranżację E1_HelloSequence , 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 orkiestracji. Jest uruchamiany i wykonywany szybko, więc zobaczysz go w stanie Ukończono z odpowiedzią, która wygląda następująco (przycięte 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ć, wystąpienie runtimeStatus jest ukończone i output zawiera wynik serializacji JSON wykonywania funkcji orkiestratora.

Uwaga

Możesz zaimplementować podobną logikę startową dla innych typów wyzwalaczy, takich jak queueTrigger, eventHubTriggerlub timerTrigger.

Przyjrzyj się dziennikom wykonywania funkcji. Funkcja została uruchomiona E1_HelloSequence i ukończona wiele razy ze względu na zachowanie odtwarzania opisane w temacie niezawodność orkiestracji. Z drugiej strony były tylko trzy wykonania, ponieważ te wykonania E1_SayHello 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 fan-out/fan-in.