Zarządzanie wystąpieniami w usłudze Durable Functions na platformie Azure

Orkiestracje w usłudze Durable Functions to długotrwałe funkcje stanowe, które mogą być uruchamiane, odpytywane, zawieszone, wznawiane i przerywane przy użyciu wbudowanych interfejsów API zarządzania. Kilka innych interfejsów API zarządzania wystąpieniami jest również uwidacznianych przez powiązanie klienta orkiestracji durable functions, takie jak wysyłanie zdarzeń zewnętrznych do wystąpień, przeczyszczanie historii wystąpienia itp. Ten artykuł zawiera szczegółowe informacje o wszystkich obsługiwanych operacjach zarządzania wystąpieniami.

Uruchamianie wystąpień

Metoda start-new (lub schedule-new) w powiązaniu klienta aranżacji uruchamia nowe wystąpienie aranżacji. Ta metoda wewnętrznie zapisuje komunikat za pośrednictwem dostawcy magazynu Durable Functions, a następnie zwraca. Ten komunikat asynchronicznie wyzwala początek funkcji orkiestracji o określonej nazwie.

Parametry uruchamiania nowego wystąpienia orkiestracji są następujące:

  • Nazwa: nazwa funkcji orkiestratora do zaplanowana.
  • Dane wejściowe: wszelkie dane serializowalne w formacie JSON, które powinny być przekazywane jako dane wejściowe do funkcji orkiestratora.
  • InstanceId: (Opcjonalnie) Unikatowy identyfikator wystąpienia. Jeśli nie określisz tego parametru, metoda używa losowego identyfikatora.

Napiwek

Użyj identyfikatora losowego dla identyfikatora wystąpienia, jeśli jest to możliwe. Identyfikatory wystąpień losowych pomagają zapewnić równomierną dystrybucję obciążenia podczas skalowania funkcji orkiestratora na wielu maszynach wirtualnych. Odpowiedni czas używania identyfikatorów wystąpień innych niż losowe jest wtedy, gdy identyfikator musi pochodzić ze źródła zewnętrznego lub podczas implementowania wzorca orkiestratora pojedynczego wystąpienia.

Poniższy kod to przykładowa funkcja, która uruchamia nowe wystąpienie orkiestracji:

[FunctionName("HelloWorldQueueTrigger")]
public static async Task Run(
    [QueueTrigger("start-queue")] string input,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    string instanceId = await starter.StartNewAsync("HelloWorld", input);
    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Azure Functions Core Tools

Możesz również uruchomić wystąpienie bezpośrednio przy użyciu func durable start-new polecenia w narzędziach Core Tools, które przyjmuje następujące parametry:

  • function-name (wymagane): nazwa funkcji do uruchomienia.
  • input (opcjonalnie): Dane wejściowe funkcji w tekście lub za pośrednictwem pliku JSON. W przypadku plików dodaj prefiks do ścieżki do pliku z elementem @, takim jak @path/to/file.json.
  • id (opcjonalnie): identyfikator wystąpienia aranżacji. Jeśli nie określisz tego parametru, polecenie używa losowego identyfikatora GUID.
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna to DurableFunctionsHub. Można to również ustawić w host.json za pomocą rozszerzenia durableTask:HubName.

Uwaga

Polecenia narzędzi Core Tools zakładają, że uruchamiasz je z katalogu głównego aplikacji funkcji. Jeśli jawnie podasz connection-string-setting parametry i task-hub-name , możesz uruchomić polecenia z dowolnego katalogu. Chociaż można uruchamiać te polecenia bez uruchomionego hosta aplikacji funkcji, może się okazać, że nie można obserwować niektórych efektów, chyba że host jest uruchomiony. Na przykład start-new polecenie umieszcza komunikat początkowy w docelowym centrum zadań, ale aranżacja nie jest uruchamiana, chyba że istnieje proces hosta aplikacji funkcji, który może przetworzyć komunikat.

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Następujące polecenie uruchamia funkcję o nazwie HelloWorld i przekazuje do niego zawartość pliku counter-data.json :

func durable start-new --function-name HelloWorld --input @counter-data.json --task-hub-name TestTaskHub

Wystąpienia zapytań

Po uruchomieniu nowych wystąpień orkiestracji najprawdopodobniej będzie konieczne wykonanie zapytania o stan środowiska uruchomieniowego, aby dowiedzieć się, czy są uruchomione, czy zakończyły się niepowodzeniem.

Metoda get-status w powiązaniu klienta aranżacji wysyła zapytanie o stan wystąpienia aranżacji.

Przyjmuje ( instanceId wymagane), showHistory (opcjonalne), showHistoryOutput (opcjonalne) i showInput (opcjonalnie) jako parametry.

  • showHistory: Jeśli ustawiono wartość true, odpowiedź zawiera historię wykonywania.
  • showHistoryOutput: Jeśli ustawiono wartość true, historia wykonywania zawiera dane wyjściowe działań.
  • showInput: Jeśli ustawiono wartość false, odpowiedź nie będzie zawierać danych wejściowych funkcji. Domyślna wartość to true.

Metoda zwraca obiekt o następujących właściwościach:

  • Nazwa: nazwa funkcji orkiestratora.
  • InstanceId: identyfikator wystąpienia aranżacji (powinien być taki sam jak instanceId dane wejściowe).
  • CreatedTime: czas uruchomienia funkcji orkiestratora.
  • LastUpdatedTime: godzina ostatniego punktu kontrolnego aranżacji.
  • Dane wejściowe: dane wejściowe funkcji jako wartość JSON. To pole nie jest wypełniane, jeśli showInput ma wartość false.
  • CustomStatus: niestandardowy stan orkiestracji w formacie JSON.
  • Dane wyjściowe: dane wyjściowe funkcji jako wartość JSON (jeśli funkcja została ukończona). Jeśli funkcja orkiestratora nie powiodła się, ta właściwość zawiera szczegóły błędu. Jeśli funkcja orkiestratora została zawieszona lub zakończona, ta właściwość zawiera przyczynę zawieszenia lub zakończenia (jeśli istnieje).
  • RuntimeStatus: Jedna z następujących wartości:
    • Oczekujące: wystąpienie zostało zaplanowane, ale nie zostało jeszcze uruchomione.
    • Uruchomione: uruchomiono wystąpienie.
    • Ukończono: Wystąpienie zostało ukończone normalnie.
    • ContinuedAsNew: Wystąpienie zostało ponownie uruchomione z nową historią. Ten stan jest stanem przejściowym.
    • Niepowodzenie: wystąpienie nie powiodło się z powodu błędu.
    • Zakończone: wystąpienie zostało nagle zatrzymane.
    • Zawieszone: wystąpienie zostało zawieszone i może zostać wznowione w późniejszym momencie.
  • Historia: historia wykonywania orkiestracji. To pole jest wypełniane tylko wtedy, gdy showHistory jest ustawione na truewartość .

Uwaga

Orkiestrator nie jest oznaczony jako Completed do momentu zakończenia wszystkich zaplanowanych zadań i zwrócenia orkiestratora. Innymi słowy, nie wystarczy, aby orkiestrator dotarł do instrukcji, return aby został oznaczony jako Completed. Jest to szczególnie istotne w przypadkach, w których WhenAny jest używana; te orkiestratory często return przed wykonaniem wszystkich zaplanowanych zadań.

Ta metoda zwraca null wartość (.NET i Java), undefined (JavaScript) lub None (Python), jeśli wystąpienie nie istnieje.

[FunctionName("GetStatus")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("check-status-queue")] string instanceId)
{
    DurableOrchestrationStatus status = await client.GetStatusAsync(instanceId);
    // do something based on the current status.
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Azure Functions Core Tools

Stan wystąpienia orkiestracji można również uzyskać bezpośrednio przy użyciu func durable get-runtime-status polecenia w narzędziach Core Tools.

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Polecenie durable get-runtime-status przyjmuje następujące parametry:

  • id (wymagane): identyfikator wystąpienia aranżacji.
  • show-input (opcjonalnie): Jeśli ustawiono wartość true, odpowiedź zawiera dane wejściowe funkcji. Domyślna wartość to false.
  • show-output (opcjonalnie): Jeśli ustawiono wartość true, odpowiedź zawiera dane wyjściowe funkcji. Domyślna wartość to false.
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna to DurableFunctionsHub. Można go również ustawić w host.json za pomocą rozszerzenia durableTask:HubName.

Następujące polecenie pobiera stan (w tym dane wejściowe i wyjściowe) wystąpienia z identyfikatorem wystąpienia aranżacji 0ab8c5a66644d68a3a8b220b12d209c. Przyjęto założenie, że uruchamiasz func polecenie z katalogu głównego aplikacji funkcji:

func durable get-runtime-status --id 0ab8c55a66644d68a3a8b220b12d209c --show-input true --show-output true

Możesz użyć durable get-history polecenia , aby pobrać historię wystąpienia orkiestracji. Przyjmuje następujące parametry:

  • id (wymagane): identyfikator wystąpienia aranżacji.
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna to DurableFunctionsHub. Można go również ustawić w host.json za pomocą rozszerzenia durableTask:HubName.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c

Wykonywanie zapytań względem wszystkich wystąpień

Interfejsy API w zestawie SDK języka umożliwiają wykonywanie zapytań o stany wszystkich wystąpień aranżacji w centrum zadań. Ten interfejs API "list-instances" lub "get-status" zwraca listę obiektów reprezentujących wystąpienia aranżacji zgodne z parametrami zapytania.

[FunctionName("GetAllStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    var noFilter = new OrchestrationStatusQueryCondition();
    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        noFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }
    
    // Note: ListInstancesAsync only returns the first page of results.
    // To request additional pages provide the result.ContinuationToken
    // to the OrchestrationStatusQueryCondition's ContinuationToken property.
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Azure Functions Core Tools

Istnieje również możliwość bezpośredniego wykonywania zapytań dotyczących wystąpień za pomocą func durable get-instances polecenia w narzędziach Core Tools.

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Polecenie durable get-instances przyjmuje następujące parametry:

  • top (opcjonalnie): To polecenie obsługuje stronicowanie. Ten parametr odpowiada liczbie wystąpień pobranych na żądanie. Wartość domyślna to 10.
  • continuation-token (opcjonalnie): token wskazujący, która strona lub sekcja wystąpień do pobrania. Każde get-instances wykonanie zwraca token do następnego zestawu wystąpień.
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna to DurableFunctionsHub. Można go również ustawić w host.json za pomocą rozszerzenia durableTask:HubName.
func durable get-instances

Wykonywanie zapytań względem wystąpień z filtrami

Co zrobić, jeśli naprawdę nie potrzebujesz wszystkich informacji, które może dostarczyć standardowe zapytanie wystąpienia? Na przykład co zrobić, jeśli szukasz czasu utworzenia orkiestracji lub stanu środowiska uruchomieniowego orkiestracji? Zapytanie można zawęzić, stosując filtry.

[FunctionName("QueryStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    // Get the first 100 running or pending instances that were created between 7 and 1 day(s) ago
    var queryFilter = new OrchestrationStatusQueryCondition
    {
        RuntimeStatus = new[]
        {
            OrchestrationRuntimeStatus.Pending,
            OrchestrationRuntimeStatus.Running,
        },
        CreatedTimeFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
        CreatedTimeTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
        PageSize = 100,
    };
    
    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        queryFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Azure Functions Core Tools

W narzędziach Azure Functions Core Tools można również użyć durable get-instances polecenia z filtrami. Oprócz wyżej wymienionych topparametrów , , continuation-tokenconnection-string-settingi task-hub-name można użyć trzech parametrów filtru (created-after, created-before, i runtime-status).

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Poniżej przedstawiono parametry polecenia durable get-instances .

  • created-after (opcjonalnie): pobierz wystąpienia utworzone po tej dacie/godzinie (UTC). Zaakceptowano formatowane daty/godziny ISO 8601.
  • created-before (opcjonalnie): pobierz wystąpienia utworzone przed tą datą/godziną (UTC). Zaakceptowano formatowane daty/godziny ISO 8601.
  • runtime-status (opcjonalnie): pobieranie wystąpień o określonym stanie (na przykład uruchomienie lub ukończenie). Może zapewnić wiele stanów (rozdzielonych spacjami).
  • top (opcjonalnie): liczba wystąpień pobranych na żądanie. Wartość domyślna to 10.
  • continuation-token (opcjonalnie): token wskazujący, która strona lub sekcja wystąpień do pobrania. Każde get-instances wykonanie zwraca token do następnego zestawu wystąpień.
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna to DurableFunctionsHub. Można go również ustawić w host.json za pomocą rozszerzenia durableTask:HubName.

Jeśli nie podasz żadnych filtrów (created-after, created-beforelub runtime-status), polecenie po prostu pobiera top wystąpienia bez względu na stan środowiska uruchomieniowego ani czas tworzenia.

func durable get-instances --created-after 2021-03-10T13:57:31Z --created-before  2021-03-10T23:59Z --top 15

Kończenie wystąpień

Jeśli masz wystąpienie orkiestracji, które trwa zbyt długo lub po prostu musisz zatrzymać je przed ukończeniem z jakiegokolwiek powodu, możesz go zakończyć.

Dwa parametry interfejsu API zakończenia są identyfikatorem wystąpienia i ciągiem przyczyny, który jest zapisywany w dziennikach i w stanie wystąpienia.

[FunctionName("TerminateInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("terminate-queue")] string instanceId)
{
    string reason = "Found a bug";
    return client.TerminateAsync(instanceId, reason);
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Zakończone wystąpienie zostanie ostatecznie przekształcone w Terminated stan . Jednak to przejście nie nastąpi natychmiast. Zamiast tego operacja zakończenia zostanie w kolejce w centrum zadań wraz z innymi operacjami dla tego wystąpienia. Możesz użyć interfejsów API zapytań wystąpienia, aby dowiedzieć się, kiedy wystąpienie zakończone faktycznie osiągnęło Terminated stan.

Uwaga

Zakończenie wystąpienia nie jest obecnie propagowane. Funkcje działań i podarancje są uruchamiane w celu ukończenia, niezależnie od tego, czy wystąpienie orkiestracji zostało zakończone, które je nazwało.

Wstrzymywanie i wznawianie wystąpień

Wstrzymanie orkiestracji umożliwia zatrzymanie działającej orkiestracji. W przeciwieństwie do zakończenia, istnieje możliwość wznowienia zawieszonego orkiestratora w późniejszym momencie.

Dwa parametry interfejsu API wstrzymania to identyfikator wystąpienia i ciąg przyczyny, który jest zapisywany w dziennikach i w stanie wystąpienia.

[FunctionName("SuspendResumeInstance")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("suspend-resume-queue")] string instanceId)
{
    string suspendReason = "Need to pause workflow";
    await client.SuspendAsync(instanceId, suspendReason);
    
    // Wait for 30 seconds to ensure that the orchestrator state is updated to suspended. 
    DateTime dueTime = context.CurrentUtcDateTime.AddSeconds(30);
    await context.CreateTimer(dueTime, CancellationToken.None);
    
    string resumeReason = "Continue workflow";
    await client.ResumeAsync(instanceId, resumeReason);
}

Wstrzymane wystąpienie zostanie ostatecznie przeniesione Suspended do stanu. Jednak to przejście nie nastąpi natychmiast. Zamiast tego operacja wstrzymania zostanie w kolejce w centrum zadań wraz z innymi operacjami dla tego wystąpienia. Możesz użyć interfejsów API zapytań wystąpienia, aby wiedzieć, kiedy uruchomione wystąpienie rzeczywiście osiągnęło stan Wstrzymane.

Po wznowieniu zawieszonego koordynatora jego stan zmieni się z powrotem na Running.

Azure Functions Core Tools

Wystąpienie orkiestracji można również zakończyć bezpośrednio za pomocą func durable terminate polecenia w narzędziach Core Tools.

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Polecenie durable terminate przyjmuje następujące parametry:

  • id (wymagane): identyfikator wystąpienia orkiestracji do zakończenia.
  • reason (opcjonalnie): przyczyna zakończenia.
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna to DurableFunctionsHub. Można go również ustawić w host.json za pomocą rozszerzenia durableTask:HubName.

Następujące polecenie kończy wystąpienie orkiestracji o identyfikatorze 0ab8c55a66644d68a3a8b220b12d209c:

func durable terminate --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Found a bug"

Wysyłanie zdarzeń do wystąpień

W niektórych scenariuszach funkcje orkiestratora muszą czekać i nasłuchiwać zdarzeń zewnętrznych. Przykładowe scenariusze, w których jest to przydatne, obejmują scenariusze monitorowania i interakcji człowieka.

Powiadomienia o zdarzeniach można wysyłać do uruchomionych wystąpień przy użyciu interfejsu API zgłaszania zdarzeń klienta aranżacji. Orkiestracje mogą nasłuchiwać tych zdarzeń i reagować na nie przy użyciu interfejsu API oczekiwania na zewnętrzne orkiestratora zdarzeń .

Parametry zdarzenia zgłaszania są następujące:

  • Identyfikator wystąpienia: unikatowy identyfikator wystąpienia.
  • Nazwa zdarzenia: nazwa zdarzenia do wysłania.
  • Dane zdarzenia: ładunek z możliwością serializacji JSON do wysłania do wystąpienia.
[FunctionName("RaiseEvent")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("event-queue")] string instanceId)
{
    int[] eventData = new int[] { 1, 2, 3 };
    return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Uwaga

Jeśli nie ma wystąpienia orkiestracji z określonym identyfikatorem wystąpienia, komunikat zdarzenia zostanie odrzucony. Jeśli wystąpienie istnieje, ale nie oczekuje jeszcze na zdarzenie, zdarzenie będzie przechowywane w stanie wystąpienia, dopóki nie będzie gotowe do odebrania i przetworzenia.

Azure Functions Core Tools

Zdarzenie można również zgłosić bezpośrednio do wystąpienia aranżacji przy użyciu func durable raise-event polecenia w narzędziach Core Tools.

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Polecenie durable raise-event przyjmuje następujące parametry:

  • id (wymagane): identyfikator wystąpienia aranżacji.
  • event-name: nazwa zdarzenia do wywołania.
  • event-data (opcjonalnie): dane do wysłania do wystąpienia aranżacji. Może to być ścieżka do pliku JSON lub możesz podać dane bezpośrednio w wierszu polecenia.
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna to DurableFunctionsHub. Można go również ustawić w host.json za pomocą rozszerzenia durableTask:HubName.
func durable raise-event --id 0ab8c55a66644d68a3a8b220b12d209c --event-name MyEvent --event-data @eventdata.json
func durable raise-event --id 1234567 --event-name MyOtherEvent --event-data 3

Poczekaj na ukończenie aranżacji

W długotrwałych aranżacjach możesz poczekać i uzyskać wyniki aranżacji. W takich przypadkach warto również zdefiniować limit czasu aranżacji. Jeśli przekroczono limit czasu, należy zwrócić stan aranżacji zamiast wyników.

Interfejs API "wait for completion or create check status response" (Oczekiwanie na ukończenie lub tworzenie odpowiedzi na stan sprawdzania stanu) może służyć do synchronicznego pobierania rzeczywistych danych wyjściowych z wystąpienia orkiestracji. Domyślnie ta metoda ma domyślny limit czasu wynoszący 10 sekund i interwał sondowania wynoszący 1 sekundę.

Oto przykładowa funkcja wyzwalacza HTTP, która pokazuje, jak używać tego interfejsu API:

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace VSSample
{
    public static class HttpSyncStart
    {
        private const string Timeout = "timeout";
        private const string RetryInterval = "retryInterval";

        [FunctionName("HttpSyncStart")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/wait")]
            HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient 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}'.");

            TimeSpan timeout = GetTimeSpan(req, Timeout) ?? TimeSpan.FromSeconds(30);
            TimeSpan retryInterval = GetTimeSpan(req, RetryInterval) ?? TimeSpan.FromSeconds(1);
            
            return await starter.WaitForCompletionOrCreateCheckStatusResponseAsync(
                req,
                instanceId,
                timeout,
                retryInterval);
        }

        private static TimeSpan? GetTimeSpan(HttpRequestMessage request, string queryParameterName)
        {
            string queryParameterStringValue = request.RequestUri.ParseQueryString()[queryParameterName];
            if (string.IsNullOrEmpty(queryParameterStringValue))
            {
                return null;
            }

            return TimeSpan.FromSeconds(double.Parse(queryParameterStringValue));
        }
    }
}

Wywołaj funkcję za pomocą następującego wiersza. Użyj 2 sekund dla limitu czasu i 0,5 sekundy dla interwału ponawiania prób:

curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"

Uwaga

Powyższe polecenie cURL zakłada, że masz funkcję orkiestratora o nazwie E1_HelloSequence w projekcie. Ze względu na sposób zapisywania funkcji wyzwalacza HTTP można zastąpić ją nazwą dowolnej funkcji orkiestratora w projekcie.

W zależności od czasu wymaganego do uzyskania odpowiedzi z wystąpienia orkiestracji istnieją dwa przypadki:

  • Wystąpienia orkiestracji są kompletne w zdefiniowanym limicie czasu (w tym przypadku 2 sekundy), a odpowiedź jest rzeczywistym wynikiem wystąpienia orkiestracji, dostarczanym synchronicznie:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:14:29 GMT
Transfer-Encoding: chunked

[
    "Hello Tokyo!",
    "Hello Seattle!",
    "Hello London!"
]
  • Wystąpienia orkiestracji nie mogą zakończyć się w ramach zdefiniowanego limitu czasu, a odpowiedź jest domyślną określoną w artykule Odnajdywanie adresów URL interfejsu API HTTP:
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:13:51 GMT
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}
Retry-After: 10
Transfer-Encoding: chunked

{
    "id": "d3b72dddefce4e758d92f4d411567177",
    "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/raiseEvent/{eventName}?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/terminate?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "suspendPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/suspend?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "resumePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/resume?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}"
}

Uwaga

Format adresów URL elementu webhook może się różnić w zależności od używanej wersji hosta usługi Azure Functions. Powyższy przykład dotyczy hosta usługi Azure Functions 3.0.

Pobieranie adresów URL elementów webhook zarządzania http

Możesz użyć systemu zewnętrznego do monitorowania lub zgłaszania zdarzeń do aranżacji. Systemy zewnętrzne mogą komunikować się z usługą Durable Functions za pośrednictwem adresów URL elementów webhook, które są częścią domyślnej odpowiedzi opisanej w artykule Odnajdywanie adresów URL interfejsu API PROTOKOŁU HTTP. Adresy URL elementów webhook mogą być również uzyskiwane programowo przy użyciu powiązania klienta aranżacji. W szczególności interfejs API tworzenia ładunku zarządzania protokołem HTTP może służyć do uzyskiwania obiektu z możliwością serializacji zawierającego te adresy URL elementu webhook.

Interfejs API tworzenia ładunku zarządzania http ma jeden parametr:

  • Identyfikator wystąpienia: unikatowy identyfikator wystąpienia.

Metody zwracają obiekt z następującymi właściwościami ciągu:

  • Identyfikator: identyfikator wystąpienia aranżacji (powinien być taki sam jak InstanceId dane wejściowe).
  • StatusQueryGetUri: adres URL stanu wystąpienia orkiestracji.
  • SendEventPostUri: adres URL "zgłoś zdarzenie" wystąpienia orkiestracji.
  • TerminatePostUri: adres URL "terminate" wystąpienia orkiestracji.
  • PurgeHistoryDeleteUri: adres URL "historii przeczyszczania" wystąpienia aranżacji.
  • suspendPostUri: adres URL "suspend" wystąpienia orkiestracji.
  • resumePostUri: adres URL "resume" wystąpienia orkiestracji.

Funkcje mogą wysyłać wystąpienia tych obiektów do systemów zewnętrznych w celu monitorowania lub zgłaszania zdarzeń w odpowiednich aranżacjach, jak pokazano w poniższych przykładach:

[FunctionName("SendInstanceInfo")]
public static void SendInstanceInfo(
    [ActivityTrigger] IDurableActivityContext ctx,
    [DurableClient] IDurableOrchestrationClient client,
    [CosmosDB(
        databaseName: "MonitorDB",
        containerName: "HttpManagementPayloads",
        Connection = "CosmosDBConnectionSetting")]out dynamic document)
{
    HttpManagementPayload payload = client.CreateHttpManagementPayload(ctx.InstanceId);

    // send the payload to Azure Cosmos DB
    document = new { Payload = payload, id = ctx.InstanceId };
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions w wersji 1.x należy DurableActivityContext użyć atrybutu IDurableActivityContextOrchestrationClient zamiast atrybutu , a nie atrybutuDurableClient, a zamiast atrybutu należy użyć DurableOrchestrationClient typu parametru IDurableOrchestrationClient. Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Ponowne przewijanie wystąpień (wersja zapoznawcza)

Jeśli wystąpi błąd orkiestracji z nieoczekiwanego powodu, możesz przywrócić wystąpienie do wcześniej w dobrej kondycji przy użyciu interfejsu API utworzonego w tym celu.

Uwaga

Ten interfejs API nie jest przeznaczony do zastąpienia odpowiednich zasad obsługi błędów i ponawiania prób. Zamiast tego ma być używany tylko w przypadkach, gdy wystąpienia orkiestracji kończą się niepowodzeniem z nieoczekiwanych powodów. Orkiestracje w stanach innych niż Failed (np. Running, Pending, Terminated, ) Completednie mogą być "zachwiane". Aby uzyskać więcej informacji na temat obsługi błędów i zasad ponawiania prób, zobacz artykuł Obsługa błędów.

Użyj metody (.NET) lub rewind (JavaScript) powiązania klienta aranżacji, aby przywrócić aranżację do stanu Uruchomiono.RewindAsync Ta metoda spowoduje również ponowne uruchomienie niepowodzeń wykonywania działań lub podaranżacji, które spowodowały niepowodzenie aranżacji.

Załóżmy na przykład, że masz przepływ pracy obejmujący serię zatwierdzeń człowieka. Załóżmy, że istnieje szereg funkcji działań, które powiadamiają kogoś o potrzebie zatwierdzenia i oczekują na odpowiedź w czasie rzeczywistym. Po otrzymaniu odpowiedzi lub przekroczeniu limitu czasu wszystkich działań zatwierdzania załóżmy, że inne działanie kończy się niepowodzeniem z powodu błędnej konfiguracji aplikacji, takiej jak nieprawidłowa parametry połączenia bazy danych. Wynikiem jest niepowodzenie aranżacji głęboko w przepływie pracy. Za pomocą interfejsu RewindAsync API (.NET) lub rewind (JavaScript) administrator aplikacji może naprawić błąd konfiguracji i cofnąć aranżację, która zakończyła się niepowodzeniem, bezpośrednio przed awarią. Żaden z kroków interakcji z człowiekiem nie musi zostać ponownie zatwierdzony, a aranżacja może zakończyć się pomyślnie.

Uwaga

Funkcja przewijania nie obsługuje ponownego przewijania wystąpień aranżacji korzystających z trwałych czasomierzy.

[FunctionName("RewindInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("rewind-queue")] string instanceId)
{
    string reason = "Orchestrator failed and needs to be revived.";
    return client.RewindAsync(instanceId, reason);
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Azure Functions Core Tools

Możesz również przewinąć wystąpienie orkiestracji bezpośrednio przy użyciu func durable rewind polecenia w narzędziach Core Tools.

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Polecenie durable rewind przyjmuje następujące parametry:

  • id (wymagane): identyfikator wystąpienia aranżacji.
  • reason (opcjonalnie): Przyczyna ponownego przewijania wystąpienia aranżacji.
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Domyślnie używana jest nazwa centrum zadań w pliku host.json .
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."

Przeczyszczanie historii wystąpień

Aby usunąć wszystkie dane skojarzone z aranżacją, możesz przeczyścić historię wystąpienia. Możesz na przykład usunąć wszystkie zasoby magazynu skojarzone z ukończonym wystąpieniem. W tym celu należy użyć interfejsu API przeczyszczania wystąpienia zdefiniowanego przez klienta aranżacji.

W tym pierwszym przykładzie pokazano, jak przeczyścić pojedyncze wystąpienie orkiestracji.

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("purge-queue")] string instanceId)
{
    return client.PurgeInstanceHistoryAsync(instanceId);
}

W następnym przykładzie pokazano funkcję wyzwalaną przez czasomierz, która czyści historię wszystkich wystąpień aranżacji zakończonych po określonym interwale czasu. W takim przypadku usuwa dane dla wszystkich wystąpień ukończonych 30 lub więcej dni temu. Ta przykładowa funkcja jest zaplanowana raz dziennie, o 12:00 CZASU UTC:

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
    return client.PurgeInstanceHistoryAsync(
        DateTime.MinValue,
        DateTime.UtcNow.AddDays(-30),  
        new List<OrchestrationStatus>
        {
            OrchestrationStatus.Completed
        });
}

Uwaga

Poprzedni kod języka C# jest przeznaczony dla rozszerzenia Durable Functions 2.x. W przypadku rozszerzenia Durable Functions 1.x należy użyć OrchestrationClient atrybutu zamiast atrybutu DurableClient i należy użyć typu parametru DurableOrchestrationClientIDurableOrchestrationClientzamiast . Aby uzyskać więcej informacji na temat różnic między wersjami, zobacz artykuł Wersje rozszerzenia Durable Functions.

Uwaga

Aby operacja historii przeczyszczania powiodła się, stan środowiska uruchomieniowego wystąpienia docelowego musi być ukończony, zakończony lub niepowodzenie.

Azure Functions Core Tools

Historię wystąpienia orkiestracji można przeczyścić przy użyciu func durable purge-history polecenia w narzędziach Core Tools. Podobnie jak w drugim przykładzie języka C# w poprzedniej sekcji, przeczyszcza historię wszystkich wystąpień aranżacji utworzonych w określonym przedziale czasu. Możesz dalej filtrować przeczyszczane wystąpienia według stanu środowiska uruchomieniowego.

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Polecenie durable purge-history ma kilka parametrów:

  • created-after (opcjonalnie): Przeczyść historię wystąpień utworzonych po tej dacie/godzinie (UTC). Zaakceptowano formatowane daty/godziny ISO 8601.
  • created-before (opcjonalnie): Przeczyść historię wystąpień utworzonych przed tą datą/godziną (UTC). Zaakceptowano formatowane daty/godziny ISO 8601.
  • runtime-status (opcjonalnie): Przeczyść historię wystąpień o określonym stanie (na przykład uruchomione lub ukończone). Może zapewnić wiele stanów (rozdzielonych spacjami).
  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Domyślnie używana jest nazwa centrum zadań w pliku host.json .

Następujące polecenie usuwa historię wszystkich nieudanych wystąpień utworzonych przed 14 listopada 2021 r. o 17:35 (UTC).

func durable purge-history --created-before 2021-11-14T19:35:00.0000000Z --runtime-status failed

Usuwanie centrum zadań

func durable delete-task-hub Za pomocą polecenia w narzędziach Core Tools można usunąć wszystkie artefakty magazynu skojarzone z określonym centrum zadań, w tym tabele usługi Azure Storage, kolejki i obiekty blob.

Uwaga

Polecenia narzędzi Core Tools są obecnie obsługiwane tylko w przypadku używania domyślnego dostawcy usługi Azure Storage do utrwalania stanu środowiska uruchomieniowego.

Polecenie durable delete-task-hub ma dwa parametry:

  • connection-string-setting(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna to AzureWebJobsStorage.
  • task-hub-name (opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Domyślnie używana jest nazwa centrum zadań w pliku host.json .

Następujące polecenie usuwa wszystkie dane usługi Azure Storage skojarzone z UserTest centrum zadań.

func durable delete-task-hub --task-hub-name UserTest

Następne kroki