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 DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . 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ść totrue
.
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 natrue
wartość .
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 DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . 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ść tofalse
.show-output
(opcjonalnie): Jeśli ustawiono wartośćtrue
, odpowiedź zawiera dane wyjściowe funkcji. Domyślna wartość tofalse
.connection-string-setting
(opcjonalnie): nazwa ustawienia aplikacji zawierającego parametry połączenia magazynu do użycia. Wartość domyślna toAzureWebJobsStorage
.task-hub-name
(opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna toDurableFunctionsHub
. 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 toAzureWebJobsStorage
.task-hub-name
(opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna toDurableFunctionsHub
. 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 DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . 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żdeget-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 toAzureWebJobsStorage
.task-hub-name
(opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna toDurableFunctionsHub
. 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 DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . 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 top
parametrów , , continuation-token
connection-string-setting
i 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żdeget-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 toAzureWebJobsStorage
.task-hub-name
(opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna toDurableFunctionsHub
. Można go również ustawić w host.json za pomocą rozszerzenia durableTask:HubName.
Jeśli nie podasz żadnych filtrów (created-after
, created-before
lub 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 DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . 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 toAzureWebJobsStorage
.task-hub-name
(opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna toDurableFunctionsHub
. 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 DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . 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 toAzureWebJobsStorage
.task-hub-name
(opcjonalnie): nazwa centrum zadań Durable Functions do użycia. Wartość domyślna toDurableFunctionsHub
. 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 IDurableActivityContext
OrchestrationClient
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
, ) Completed
nie 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 DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . 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 toAzureWebJobsStorage
.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 DurableOrchestrationClient
IDurableOrchestrationClient
zamiast . 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 toAzureWebJobsStorage
.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 toAzureWebJobsStorage
.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