Udostępnij przez


Orkiestracje wieczne w usłudze Durable Functions (Azure Functions)

Wieczne orkiestracje to funkcje orkiestratora, które nigdy się nie kończą. Są one przydatne, gdy chcesz używać Durable Functions do agregatorów oraz w scenariuszach wymagających nieskończonej pętli.

Historia orkiestracji

Jak wyjaśniono w temacie historia orkiestracji, framework Durable Task Framework śledzi historię każdej orkiestracji funkcji. Historia ta jest stale rozbudowywana, dopóki funkcja orkiestratora kontynuuje harmonogramowanie nowych zadań. Jeśli funkcja orkiestratora przechodzi w nieskończoną pętlę i stale planuje pracę, ta historia może wzrosnąć krytycznie i spowodować znaczne problemy z wydajnością. Koncepcja wiecznej aranżacji została zaprojektowana w celu wyeliminowania tego rodzaju problemów dla aplikacji, które wymagają nieskończonych pętli.

Resetowanie i ponowne uruchamianie

Zamiast używać nieskończonych pętli, funkcje orkiestratora resetują swój stan, wywołując metodę continue-as-newpowiązania wyzwalacza orkiestracji. Ta metoda przyjmuje parametr z możliwością serializacji JSON, który staje się nowym wejściem dla następnej generacji funkcji orkiestratora.

Po wywołaniu continue-as-new wystąpienie orkiestracji restartuje się z nową wartością wejściową. Ten sam identyfikator wystąpienia jest zachowywany, ale historia funkcji orkiestratora jest resetowany.

Zagadnienia dotyczące orkiestracji wiecznej

Podczas używania continue-as-new metody w aranżacji należy pamiętać o następujących kwestiach:

  • Gdy funkcja orkiestratora zostanie zresetowana przy użyciu metody continue-as-new, struktura Durable Task Framework zachowuje ten sam identyfikator wystąpienia, ale wewnętrznie tworzy i używa nowego identyfikatora wykonania na przyszłość. Ten identyfikator wykonania nie jest widoczny zewnętrznie, ale może być przydatny podczas debugowania procesów orkiestracyjnych.

  • Gdy podczas wykonywania wystąpi nieobsługiwany wyjątek, orkiestracja przechodzi w stan niepowodzenia i kończy wykonywanie. W tym stanie wywołanie continue-as-new z finally bloku instrukcji try-catch nie może ponownie uruchomić aranżacji.

Ważne

Jeśli podczas wykonywania orkiestracja napotka nieuchwycony wyjątek, orkiestracja przejdzie w stan "niepowodzenie", a wykonanie zostanie zakończone. W szczególności oznacza to, że wywołanie continue-as-new, nawet w finally bloku, nie uruchomi ponownie orkiestracji w przypadku wyjątku nieuchwyconego.

Przykład pracy okresowej

Jednym z przypadków użycia wiecznych orkiestracji jest kod, który musi wykonywać okresową pracę bez końca.

[FunctionName("Periodic_Cleanup_Loop")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    await context.CallActivityAsync("DoCleanup", null);

    // sleep for one hour between cleanups
    DateTime nextCleanup = context.CurrentUtcDateTime.AddHours(1);
    await context.CreateTimer(nextCleanup, CancellationToken.None);

    context.ContinueAsNew(null);
}

Uwaga / Notatka

Poprzedni przykład w języku C# dotyczy rozszerzenia Durable Functions 2.x. W przypadku Durable Functions 1.x należy użyć DurableOrchestrationContext zamiast IDurableOrchestrationContext. Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje Durable Functions.

Różnica między tym przykładem a funkcją wyzwalaną przez czasomierz polega na tym, że czasy wyzwalacza oczyszczania nie są oparte na harmonogramie. Na przykład harmonogram CRON, który wykonuje funkcję co godzinę jest uruchamiany o godzinie 1:00, 2:00, 3:00 itd., i może potencjalnie napotkać nakładające się problemy. W tym przykładzie jednak, jeśli czyszczenie trwa 30 minut, jest planowane na 1:00, 2:30, 4:00 itd., i nie ma możliwości na nakładanie się.

Rozpoczynanie wiecznej orkiestracji

Użyj metody klienta start-new lub schedule-new durable, aby rozpocząć wieczną orkiestrację, tak jak w przypadku każdej innej funkcji orkiestracji.

Uwaga / Notatka

Jeśli musisz upewnić się, że trwała singletonowa orkiestracja jest uruchomiona, ważne jest, aby zachować to samo wystąpienie id podczas uruchamiania orkiestracji. Aby uzyskać więcej informacji, zobacz Zarządzanie wystąpieniami.

[FunctionName("Trigger_Eternal_Orchestration")]
public static async Task<HttpResponseMessage> OrchestrationTrigger(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage request,
    [DurableClient] IDurableOrchestrationClient client)
{
    string instanceId = "StaticId";

    await client.StartNewAsync("Periodic_Cleanup_Loop", instanceId); 
    return client.CreateCheckStatusResponse(request, instanceId);
}

Uwaga / Notatka

Poprzedni kod dotyczy Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x użyj atrybutu OrchestrationClient zamiast atrybutu DurableClient i użyj typu parametru DurableOrchestrationClient zamiast IDurableOrchestrationClient. Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje Durable Functions.

Wyjście z wiecznej orkiestracji

Jeśli funkcja orkiestratora musi ostatecznie się zakończyć, wystarczy nie wywoływać ContinueAsNew i pozwolić funkcji zakończyć działanie.

Jeśli funkcja orkiestratora znajduje się w nieskończonej pętli i musi zostać zatrzymana, użyj interfejsu API terminate powiązania klienta orkiestracji , aby go zatrzymać. Aby uzyskać więcej informacji, zobacz Zarządzanie wystąpieniami.

Dalsze kroki