Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Orchestrace v Durable Functions jsou dlouhotrvající stavové funkce, které se dají spustit, dotazovat, pozastavit, obnovit a ukončit pomocí integrovaných rozhraní API pro správu. Několik dalších rozhraní API pro správu instancí je také vystaveno klientskou vazbou orchestrace Durable Functions, jako odesílání externích událostí instancím, vymazání historie instancí atd. Tento článek obsahuje podrobnosti o všech podporovaných operacích správy instancí.
Spuštění instancí
Metoda start-new (nebo schedule-new) na vazbě klienta orchestrace spustí novou instanci orchestrace. Interně tato metoda zapíše zprávu prostřednictvím zprostředkovatele úložiště Durable Functions a poté vrátí. Tato zpráva asynchronně aktivuje začátek funkce orchestrace se zadaným názvem.
Parametry pro spuštění nové instance orchestrace jsou následující:
- Název: Název funkce orchestrátora, která má být naplánována.
- Vstup: Jakákoli serializovatelná data JSON, která by měla být předána jako vstup do funkce orchestrátoru.
- InstanceId: (Volitelné) Jedinečné ID instance. Pokud tento parametr nezadáte, použije metoda náhodné ID.
Návod
Kdykoli je to možné, použijte pro ID instance náhodný identifikátor. ID náhodných instancí pomáhají zajistit rovnoměrnou distribuci zatížení při škálování funkcí orchestrátoru napříč několika virtuálními počítači. Je vhodné použít nenáhodné ID instancí, když ID musí pocházet z externího zdroje, nebo při implementaci vzoru singleton orchestrátoru.
Následující kód je ukázková funkce, která spouští novou instanci orchestrace:
[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}'.");
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Azure Functions Core Tools (Nástroje jádra pro funkce Azure)
Instanci můžete spustit také přímo pomocí func durable start-new příkazu v nástrojích Core Tools, který přebírá následující parametry:
-
function-name(povinné): Název funkce, která se má spustit. -
input(volitelné): Vstup pro funkci, buď přímo, nebo prostřednictvím souboru JSON. Pro soubory přidejte předponu k cestě k souboru,@například@path/to/file.json. -
id(volitelné): ID instance orchestrace. Pokud tento parametr nezadáte, použije příkaz náhodný identifikátor GUID. -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota je AzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Výchozí hodnota je DurableFunctionsHub. Můžete to také nastavit v host.json pomocí durableTask:HubName.
Poznámka:
Příkazy Core Tools předpokládají, že je spouštíte z kořenového adresáře aplikace funkcí. Pokud explicitně zadáte connection-string-setting parametry a task-hub-name parametry, můžete příkazy spustit z libovolného adresáře. I když tyto příkazy můžete spouštět bez spuštěného hostitele aplikace funkcí, můžete zjistit, že pokud není hostitel spuštěný, některé efekty nemůžete sledovat.
start-new Například příkaz zařadí inicializační zprávu do cílového centra úloh, ale orchestrace se ve skutečnosti nespustí, pokud není spuštěn hostitelský proces funkční aplikace, který může zprávu zpracovat.
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Následující příkaz spustí funkci s názvem HelloWorld a předá do ní obsah souboru counter-data.json :
func durable start-new --function-name HelloWorld --input @counter-data.json --task-hub-name TestTaskHub
Instance dotazů
Po spuštění nových instancí orchestrace budete pravděpodobně muset dotazovat stav modulu runtime, abyste se dozvěděli, jestli jsou spuštěné, dokončené nebo neúspěšné.
Metoda get-status na vazbě klienta orchestrace dotazuje stav instance orchestrace.
Jako parametry přebírá instanceId (povinné), showHistory (volitelné), showHistoryOutput (volitelné) a showInput (volitelné).
-
showHistory: Pokud je nastavená hodnotatrue, odpověď obsahuje historii spuštění. -
showHistoryOutput: Pokud je nastavená hodnotatrue, historie provádění obsahuje výstupy aktivit. -
showInput: Pokud je nastavená hodnotafalse, odpověď nebude obsahovat vstup funkce. Výchozí hodnota jetrue.
Metoda vrátí objekt s následujícími vlastnostmi:
- Název: Název funkce orchestrátoru.
-
InstanceId: ID instance orchestrace (musí být stejné jako
instanceIdvstup). - CreatedTime: Čas, kdy byla spuštěna funkce orchestrátoru.
- LastUpdatedTime: Čas posledního kontrolního bodu orchestrace.
-
Vstup: Zadání funkce jako hodnota JSON. Toto pole se nenaplní, pokud je
showInputnepravdivé. - CustomStatus: Vlastní stav orchestrace ve formátu JSON
- Výstup: Výstup funkce jako hodnota JSON (pokud se funkce dokončila). Pokud funkce orchestrátoru selhala, tato vlastnost obsahuje podrobnosti o selhání. Pokud byla funkce orchestrátoru pozastavena nebo ukončena, zahrnuje tato vlastnost důvod pozastavení nebo ukončení (pokud existuje).
-
RuntimeStatus: Jedna z následujících hodnot:
- V očekávání: Instance byla naplánována, ale ještě nebyla spuštěna.
- Spuštěno: Instance se spustila.
- Dokončeno: Instance se dokončila normálně.
- ContinuedAsNew: Instance se znovu spustila s novou historií. Tento stav je přechodný.
- Nezdařilo se: Instance selhala s chybou.
- Ukončeno: Instance byla náhle zastavena.
- Pozastaveno: Instance byla pozastavena a může být obnovena později.
-
Historie: Historie provádění orchestrace. Toto pole je vyplněno pouze v případě, že
showHistoryje nastaveno natruehodnotu .
Poznámka:
Orchestrátor není označený jako Completed dokud nedokončí všechny naplánované úkoly a orchestrátor se vrátí. Jinými slovy, není dostačující, aby orchestrátor dosáhl svého return prohlášení, aby byl označen jako Completed. To je zvlášť důležité pro případy, kdy je WhenAny použit; tyto orchestrátory často return před provedením všech naplánovaných úloh.
Tato metoda vrátí null (.NET a Java), undefined (JavaScript) nebo None (Python), pokud instance neexistuje.
[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.
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Azure Functions Core Tools (Nástroje jádra pro funkce Azure)
Stav instance orchestrace je také možné získat přímo pomocí func durable get-runtime-status příkazu v nástrojích Core Tools.
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Příkaz durable get-runtime-status přijímá následující parametry:
-
id(povinné): ID instance orchestrace. -
show-input(volitelné): Pokud je nastavená hodnotatrue, odpověď obsahuje vstup funkce. Výchozí hodnota jefalse. -
show-output(volitelné): Pokud je nastavena hodnotatrue, odpověď obsahuje výstup funkce. Výchozí hodnota jefalse. -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Výchozí hodnota jeDurableFunctionsHub. Lze ho také nastavit v host.jsonpomocí durableTask:HubName.
Následující příkaz načte stav instance (včetně vstupu a výstupu) s ID instance orchestrace 0ab8c55a6664d68a3a8b220b12d209c. Předpokládá se, že spouštíte func příkaz z kořenového adresáře aplikace funkcí:
func durable get-runtime-status --id 0ab8c55a66644d68a3a8b220b12d209c --show-input true --show-output true
Pomocí durable get-history příkazu můžete načíst historii instance orchestrace. Přebírá následující parametry:
-
id(povinné): ID instance orchestrace. -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Výchozí hodnota jeDurableFunctionsHub. Lze ho také nastavit v host.jsonpomocí durableTask:HubName.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c
Dotaz na všechny instance
Pomocí rozhraní API v sadě SDK jazyka můžete dotazovat stav všech instancí orchestrace v centru úloh. Toto rozhraní API "list-instance" nebo "get-status" vrátí seznam objektů, které představují instance orchestrace odpovídající parametrům dotazu.
[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.
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Azure Functions Core Tools (Nástroje jádra pro funkce Azure)
Instance je také možné dotazovat přímo pomocí func durable get-instances příkazu v nástrojích Core Tools.
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Příkaz durable get-instances přijímá následující parametry:
-
top(volitelné): Tento příkaz podporuje stránkování. Tento parametr odpovídá počtu instancí načtených na jeden požadavek. Výchozí hodnota je 10. -
continuation-token(volitelné): Token označující stránku nebo sekci instancí, které se mají načíst. Každéget-instancesspuštění vrátí token do následující sady instancí. -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Výchozí hodnota jeDurableFunctionsHub. Lze ho také nastavit v host.jsonpomocí durableTask:HubName.
func durable get-instances
Dotazování instancí pomocí filtrů
Co když opravdu nepotřebujete všechny informace, které může poskytnout standardní dotaz instance? Co když například právě hledáte čas vytvoření orchestrace nebo stav běhu orchestrace? Dotaz můžete zúžit použitím filtrů.
[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));
}
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Azure Functions Core Tools (Nástroje jádra pro funkce Azure)
V nástrojích Azure Functions Core Tools můžete také použít durable get-instances příkaz s filtry. Kromě výše uvedených topparametrů , , continuation-tokenconnection-string-settinga task-hub-name parametrů můžete použít tři parametry filtru (created-after, created-beforea runtime-status).
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Níže jsou uvedené parametry příkazu durable get-instances .
-
created-after(volitelné): Načtěte instance vytvořené po tomto datu a čase (UTC). Datum a čas ve formátu ISO 8601 jsou akceptovány. -
created-before(volitelné): Načtěte instance vytvořené před tímto datem a časem (UTC). Datum a časy ve formátu ISO 8601 jsou podporovány. -
runtime-status(volitelné): Načtěte instance s určitým stavem (například spuštěno nebo dokončeno). Může poskytovat více stavů (oddělených mezerami). -
top(volitelné): Počet načtených instancí na dotaz. Výchozí hodnota je 10. -
continuation-token(volitelné): Token označující stránku nebo sekci instancí, které se mají načíst. Každéget-instancesspuštění vrátí token do následující sady instancí. -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Výchozí hodnota jeDurableFunctionsHub. Lze ho také nastavit v host.jsonpomocí durableTask:HubName.
Pokud nezadáte žádné filtry (created-after, created-before nebo runtime-status), příkaz jednoduše načte instance top bez ohledu na stav během runtime nebo čas vytvoření.
func durable get-instances --created-after 2021-03-10T13:57:31Z --created-before 2021-03-10T23:59Z --top 15
Ukončit instance
Pokud máte instanci orchestrace, která trvá příliš dlouho, nebo ji z jakéhokoli důvodu potřebujete zastavit před jejím dokončením, můžete ji ukončit.
Dva parametry pro ukončovací rozhraní API jsou ID instance a řetězec důvodu , který se zapisuje do protokolů a do stavu instance.
[FunctionName("TerminateInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("terminate-queue")] string instanceId)
{
string reason = "Found a bug";
return client.TerminateAsync(instanceId, reason);
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Ukončená instance se nakonec převede do Terminated stavu. K tomuto přechodu však nedojde okamžitě. Namísto toho bude operace ukončení zařazena do fronty v uzlu úloh spolu s dalšími operacemi pro danou instanci. Pomocí rozhraní API pro dotazy instance můžete zjistit, kdy ukončená instance skutečně dosáhla Terminated stavu.
Poznámka:
Ukončení instance se v současné době nešíruje. Funkce aktivit a dílčí orchestrace se dokončují, a to bez ohledu na to, zda jste ukončili instanci orchestrace, která je volala.
Pozastavení a obnovení instancí
Pozastavení orchestrace umožňuje zastavit spuštěnou orchestraci. Na rozdíl od ukončení máte možnost obnovit pozastavený orchestrátor v pozdějším okamžiku.
Dva parametry pro pozastavené rozhraní API jsou ID instance a řetězec důvodu, který se zapisuje do protokolů a do stavu instance.
[FunctionName("SuspendResumeInstance")]
public static async Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("suspend-resume-queue")] string instanceId)
{
// To suspend an orchestration
string suspendReason = "Need to pause workflow";
await client.SuspendAsync(instanceId, suspendReason);
// To resume an orchestration
string resumeReason = "Continue workflow";
await client.ResumeAsync(instanceId, resumeReason);
}
Pozastavená instance nakonec přejde do Suspended stavu. K tomuto přechodu však nedojde okamžitě. Místo toho se operace pozastavení zařadí do fronty v centru úloh spolu s dalšími operacemi pro danou instanci. Pomocí rozhraní API pro dotazy instance můžete zjistit, kdy spuštěná instance skutečně dosáhla pozastaveného stavu.
Po obnovení pozastaveného orchestrátoru se jeho stav změní zpět na Running.
Azure Functions Core Tools (Nástroje jádra pro funkce Azure)
Instanci orchestrace můžete také ukončit přímo pomocí func durable terminate příkazu v nástrojích Core Tools.
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Příkaz durable terminate přijímá následující parametry:
-
id(povinné): ID instance orchestrace, která se má ukončit. -
reason(volitelné): Důvod ukončení. -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Výchozí hodnota jeDurableFunctionsHub. Lze ho také nastavit v host.jsonpomocí durableTask:HubName.
Následující příkaz ukončí instanci orchestrace s ID 0ab8c55a6644d68a3a8b220b12d209c:
func durable terminate --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Found a bug"
Odesílání událostí do instancí
V některých scénářích musí funkce orchestrátoru čekat a naslouchat externím událostem. Mezi příklady scénářů, ve kterých je to užitečné, patří scénáře monitorování a lidské interakce .
Oznámení událostí můžete odesílat do spuštěných instancí pomocí rozhraní API pro vyvolání událostíklienta orchestrace. Orchestrace mohou naslouchat těmto událostem a reagovat na ně pomocí API orchestrátoru čekání na externí událost.
Parametry pro vyvolání události jsou následující:
- ID instance: Jedinečné ID instance.
- Název události: Název události, která se má odeslat.
- Data události: JSON serializovatelná datová část k odeslání do instance.
[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);
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Poznámka:
Pokud neexistuje žádná instance orchestrace se zadaným ID instance, zpráva události se zahodí. Pokud instance existuje, ale ještě nečeká na událost, událost bude uložena ve stavu instance, dokud nebude připravena k přijetí a zpracování.
Azure Functions Core Tools (Nástroje jádra pro funkce Azure)
Událost můžete také vyvolat přímo do instance orchestrace pomocí func durable raise-event příkazu v nástrojích Core Tools.
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Příkaz durable raise-event přijímá následující parametry:
-
id(povinné): ID instance orchestrace. -
event-name: Název události, která se má vyvolat. -
event-data(volitelné): Data, která se mají odeslat do instance orchestrace. Může to být cesta k souboru JSON nebo můžete data zadat přímo na příkazovém řádku. -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Výchozí hodnota jeDurableFunctionsHub. Lze ho také nastavit v host.jsonpomocí 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
Čekání na dokončení orchestrace
V dlouhotrvajících orchestracích můžete chtít počkat a získat výsledky orchestrace. V těchto případech je také užitečné umět definovat časový limit pro orchestraci. Pokud dojde k překročení časového limitu, měl by být místo výsledků vrácen stav orchestrace.
Rozhraní API "čekat na dokončení nebo vytvořit odpověď na kontrolní stav" lze použít k synchronnímu získání skutečného výstupu z instance orchestrace. Ve výchozím nastavení má tato metoda výchozí časový limit 10 sekund a interval dotazování 1 sekundu.
Tady je příklad funkce triggeru HTTP, která ukazuje, jak používat toto rozhraní 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));
}
}
}
Volejte funkci pomocí následujícího řádku. Pro časový limit použijte 2 sekundy a interval opakování 0,5 sekundy:
curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"
Poznámka:
Výše uvedený příkaz cURL předpokládá, že máte v projektu funkci orchestrátoru.E1_HelloSequence Vzhledem k tomu, jak je zapisována funkce triggeru HTTP, můžete ji nahradit názvem libovolné funkce orchestrátoru ve vašem projektu.
V závislosti na době potřebné k získání odpovědi z instance orchestrace existují dva případy:
- Instance orchestrace se dokončí v rámci definovaného časového limitu (v tomto případě 2 sekundy) a odpověď je skutečný výstup instance orchestrace, který se doručuje synchronně:
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!"
]
- Instance orchestrace se v rámci definovaného časového limitu nedokončí a odpověď je výchozí, která je popsaná ve zjišťování adres URL rozhraní HTTP API:
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}"
}
Poznámka:
Formát adres URL webhooku se může lišit v závislosti na tom, jakou verzi hostitele Azure Functions používáte. Předchozí příklad je určený pro hostitele Azure Functions 3.0.
Získat URL adresy pro správu HTTP webhooků
Externí systém můžete použít k monitorování nebo vyvolání událostí pro orchestraci. Externí systémy můžou komunikovat s Durable Functions prostřednictvím adres URL webhooku, které jsou součástí výchozí odpovědi popsané ve zjišťování adres URL rozhraní HTTP API. K adresám URL webhooku lze alternativně přistupovat programově pomocí vazby orchestrujícího klienta. Konkrétně lze rozhraní API pro vytvoření datové části správy HTTP použít k získání serializovatelného objektu, který obsahuje tyto adresy URL webhooků.
Rozhraní API pro vytvoření datové části správy HTTP má jeden parametr:
- ID instance: Jedinečné ID instance.
Metody vrátí objekt s následujícími vlastnostmi řetězce:
-
ID: ID instance orchestrace (musí být stejné jako
InstanceIdvstup). - StatusQueryGetUri: Adresa URL stavu instance orchestrace.
- SendEventPostUri: URL adresa orchestrace instance pro "vyvolání události".
- TerminatePostUri: Adresa URL "terminate" instance orchestrace.
- PurgeHistoryDeleteUri: Adresa URL "promazání historie" instance orchestrace.
- suspendPostUri: "Adresa URL instance orchestrátoru „suspend“.
- resumePostUri: Adresa URL "pokračování" instance orchestrace.
Funkce mohou odesílat instance těchto objektů do externích systémů za účelem monitorování nebo vyvolávání událostí v odpovídajících orchestracích, jak je znázorněno v následujících příkladech:
[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 };
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít DurableActivityContext místo IDurableActivityContext, musíte použít OrchestrationClient atribut místo DurableClient atributu, a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Obnovení instancí (náhled)
Pokud dojde k selhání orchestrace z neočekávaného důvodu, můžete instanci převinout do stavu, který je dříve v pořádku, pomocí rozhraní API vytvořeného pro tento účel.
Poznámka:
Toto rozhraní API nemá být náhradou za správné zpracování chyb a zásady opakování. Spíše je určena k použití pouze v případech, kdy instance orchestrace selžou z neočekávaných důvodů. Orchestrace ve stavech jiných než Failed (např. Running, Pending, Terminated, Completed) nelze "vrátit zpět". Další informace o zpracování chyb a zásadách opakování najdete v článku Zpracování chyb .
Pomocí metody RewindAsync (.NET) nebo rewind (JavaScript) vazby klienta orchestrace přepněte orchestraci zpět do stavu Spuštěno. Tato metoda také znovu spustí selhání provádění aktivity nebo dílčí orchestrace, které způsobily selhání orchestrace.
Řekněme například, že máte pracovní postup zahrnující řadu lidských schválení. Předpokládejme, že existuje řada funkcí aktivit, které uživatele upozorní, že je potřeba schválení, a počkejte na odpověď v reálném čase. Jakmile všechny aktivity schválení obdržely odpovědi nebo vypršel časový limit, předpokládejme, že jiná aktivita selže kvůli chybné konfiguraci aplikace, například kvůli neplatnému připojovacímu řetězci databáze. Výsledkem je selhání orchestrace hluboko v pracovním postupu.
RewindAsync Pomocí rozhraní API (.NET) nebo rewind (JavaScript) může správce aplikace opravit chybu konfigurace a převinout orchestraci, která selhala, zpět do stavu bezprostředně před selháním. Žádný z kroků pro lidskou interakci není potřeba znovu schválit a orchestrace se teď může úspěšně dokončit.
Poznámka:
Funkce převinutí neumožňuje převinutí instancí orchestrace, které používají trvalé časovače.
[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);
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Azure Functions Core Tools (Nástroje jádra pro funkce Azure)
Instanci orchestrace můžete také převinout přímo pomocí func durable rewind příkazu v nástrojích Core Tools.
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Příkaz durable rewind přijímá následující parametry:
-
id(povinné): ID instance orchestrace. -
reason(volitelné): Důvod převinutí instance orchestrace zpět. -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Ve výchozím nastavení se používá název centra úloh v souboruhost.json .
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."
Vymazání historie instancí
Pokud chcete odebrat všechna data přidružená k orchestraci, můžete historii instancí vymazat. Můžete například chtít odstranit všechny prostředky úložiště přidružené k dokončené instanci. K tomu použijte rozhraní API pro vyprázdnění instance, které je definováno klientem orchestrace.
Tento první příklad ukazuje, jak odstranit určitou instanci orchestrace.
[FunctionName("PurgeInstanceHistory")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("purge-queue")] string instanceId)
{
return client.PurgeInstanceHistoryAsync(instanceId);
}
Další příklad ukazuje funkci aktivovanou časovačem, která vymaže historii pro všechny instance orchestrace, které se dokončily po zadaném časovém intervalu. V tomto případě odebere data pro všechny instance dokončené před 30 nebo více dny. Tato ukázková funkce je naplánovaná tak, aby běžela jednou denně v 12:00 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
});
}
Poznámka:
Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions .
Poznámka:
Aby operace vyprázdnění historie proběhla úspěšně, stav běhu cílové instance musí být Dokončeno, Ukončeno nebo Neúspěšné.
Azure Functions Core Tools (Nástroje jádra pro funkce Azure)
Historii instance orchestrace můžete vyprázdnit pomocí func durable purge-history příkazu v nástrojích Core Tools. Podobně jako v druhém příkladu jazyka C# v předchozí části vymaže historii pro všechny instance orchestrace vytvořené během zadaného časového intervalu. Vyprázdněné instance můžete dále filtrovat podle stavu modulu runtime.
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Příkaz durable purge-history má několik parametrů:
-
created-after(volitelné): Vymažte historii instancí vytvořených po tomto datu a čase (UTC). Datum a časy ve formátu ISO 8601 jsou podporovány. -
created-before(volitelné): Vymažte historii instancí vytvořených před tímto datem a časem (UTC). Datum a časy ve formátu ISO 8601 jsou podporovány. -
runtime-status(volitelné): Vymažte historii instancí s určitým stavem (například spuštění nebo dokončení). Může poskytovat více stavů (oddělených mezerami). -
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Ve výchozím nastavení se používá název centra úloh v souboruhost.json .
Následující příkaz odstraní historii všech neúspěšných instancí vytvořených před 14. listopadu 2021 v 17:35 (UTC).
func durable purge-history --created-before 2021-11-14T19:35:00.0000000Z --runtime-status failed
Odstranění centra úloh
func durable delete-task-hub Pomocí příkazu v Nástrojích Core Tools můžete odstranit všechny artefakty úložiště přidružené k určitému centru úloh, včetně tabulek úložiště Azure, front a objektů blob.
Poznámka:
Příkazy Core Tools se v současné době podporují jenom v případě, že pro zachování stavu modulu runtime používáte výchozího poskytovatele služby Azure Storage .
Příkaz durable delete-task-hub má dva parametry:
-
connection-string-setting(volitelné): Název nastavení aplikace obsahující připojovací řetězec úložiště, který se má použít. Výchozí hodnota jeAzureWebJobsStorage. -
task-hub-name(volitelné): Název centra úloh Durable Functions, které se má použít. Ve výchozím nastavení se používá název centra úloh v souboruhost.json .
Následující příkaz odstraní všechna data úložiště Azure přidružená k UserTest centru úloh.
func durable delete-task-hub --task-hub-name UserTest