Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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-newzfinallybloku 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