Hantera instanser i Durable Functions i Azure
Orkestreringar i Durable Functions är långvariga tillståndskänsliga funktioner som kan startas, frågas, pausas, återupptas och avslutas med hjälp av inbyggda hanterings-API:er. Flera andra API:er för instanshantering exponeras också av durable functions-orkestreringsklientbindningen, till exempel att skicka externa händelser till instanser, rensa instanshistorik osv. Den här artikeln innehåller information om alla instanshanteringsåtgärder som stöds.
Starta instanser
Metoden start-new (eller schedule-new) på orkestreringsklientbindningen startar en ny orkestreringsinstans. Internt skriver den här metoden ett meddelande via Durable Functions-lagringsprovidern och returnerar sedan. Det här meddelandet utlöser asynkront starten av en orkestreringsfunktion med det angivna namnet.
Parametrarna för att starta en ny orkestreringsinstans är följande:
- Namn: Namnet på orkestreringsfunktionen som ska schemaläggas.
- Indata: Alla JSON-serialiserbara data som ska skickas som indata till orchestrator-funktionen.
- InstanceId: (Valfritt) Instansens unika ID. Om du inte anger den här parametern använder metoden ett slumpmässigt ID.
Dricks
Använd en slumpmässig identifierare för instans-ID:t när det är möjligt. Slumpmässiga instans-ID:er hjälper till att säkerställa en lika belastningsfördelning när du skalar orkestreringsfunktioner över flera virtuella datorer. Rätt tid att använda icke-slumpmässiga instans-ID är när ID:t måste komma från en extern källa eller när du implementerar singleton orchestrator-mönstret .
Följande kod är en exempelfunktion som startar en ny orkestreringsinstans:
[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}'.");
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
Azure Functions Core Tools
Du kan också starta en instans direkt med hjälp func durable start-new
av kommandot i Core Tools, som tar följande parametrar:
function-name
(krävs): Namnet på funktionen som ska startas.input
(valfritt): Indata till funktionen, antingen infogad eller via en JSON-fil. För filer lägger du till ett prefix i sökvägen till filen med@
, till exempel@path/to/file.json
.id
(valfritt): ID för orkestreringsinstansen. Om du inte anger den här parametern använder kommandot ett slumpmässigt GUID.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet är AzureWebJobsStorage.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet är DurableFunctionsHub. Du kan också ange detta i host.json med durableTask:HubName.
Kommentar
Core Tools-kommandon förutsätter att du kör dem från rotkatalogen i en funktionsapp. Om du uttryckligen anger parametrarna connection-string-setting
och task-hub-name
kan du köra kommandona från valfri katalog. Även om du kan köra de här kommandona utan att en funktionsappvärd körs kan det hända att du inte kan se några effekter om inte värden körs. Kommandot skickar till exempel start-new
ett startmeddelande till måluppgiftshubben, men orkestreringen körs inte om det inte finns en värdprocess för funktionsappen som kan bearbeta meddelandet.
Kommentar
Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Följande kommando startar funktionen med namnet HelloWorld och skickar innehållet i filen counter-data.json
till den:
func durable start-new --function-name HelloWorld --input @counter-data.json --task-hub-name TestTaskHub
Frågeinstanser
När du har startat nya orkestreringsinstanser behöver du förmodligen köra frågor mot deras körningsstatus för att lära dig om de körs, har slutförts eller har misslyckats.
Metoden get-status på orkestreringsklientbindningen frågar statusen för en orkestreringsinstans.
Det tar en instanceId
(obligatorisk), showHistory
(valfritt), showHistoryOutput
(valfritt) och showInput
(valfritt) som parametrar.
showHistory
: Om det är inställt påtrue
innehåller svaret körningshistoriken.showHistoryOutput
: Om värdet ärtrue
inställt på innehåller körningshistoriken aktivitetsutdata.showInput
: Om det är inställtfalse
på innehåller svaret inte indata för funktionen. Standardvärdet ärtrue
.
Metoden returnerar ett objekt med följande egenskaper:
- Namn: Namnet på orkestreringsfunktionen.
- InstanceId: Instans-ID:t för orkestreringen (bör vara samma som
instanceId
indata). - CreatedTime: Den tid då orkestreringsfunktionen började köras.
- LastUpdatedTime: Den tid då orkestreringen senast kontrollpunktades.
- Indata: Indata för funktionen som ett JSON-värde. Det här fältet fylls inte i om
showInput
det är falskt. - CustomStatus: Anpassad orkestreringsstatus i JSON-format.
- Utdata: Utdata för funktionen som ett JSON-värde (om funktionen har slutförts). Om orkestreringsfunktionen misslyckades innehåller den här egenskapen information om felet. Om orkestreringsfunktionen pausades eller avslutades innehåller den här egenskapen orsaken till avstängningen eller avslutningen (om någon).
- RuntimeStatus: Ett av följande värden:
- Väntar: Instansen har schemalagts men har ännu inte börjat köras.
- Körs: Instansen har börjat köras.
- Slutförd: Instansen har slutförts normalt.
- ContinuedAsNy: Instansen har startat om sig själv med en ny historik. Det här tillståndet är ett tillfälligt tillstånd.
- Misslyckades: Instansen misslyckades med ett fel.
- Avslutad: Instansen stoppades plötsligt.
- Pausad: Instansen avbröts och kan återupptas vid en senare tidpunkt.
- Historik: Orkestreringens körningshistorik. Det här fältet fylls bara i om
showHistory
är inställt påtrue
.
Kommentar
En orkestrerare markeras inte som Completed
förrän alla schemalagda aktiviteter har slutförts och orkestratorn har återvänt. Med andra ord räcker det inte att en orkestrerare når sin return
instruktion för att markeras som Completed
. Detta är särskilt relevant för fall där WhenAny
används. Dessa orkestratorer ofta return
innan alla schemalagda aktiviteter har utförts.
Den här metoden returnerar null
(.NET och Java), undefined
(JavaScript) eller None
(Python) om instansen inte finns.
[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.
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
Azure Functions Core Tools
Du kan också hämta status för en orkestreringsinstans direkt med hjälp func durable get-runtime-status
av kommandot i Core Tools.
Kommentar
Core Tools-kommandon stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Kommandot durable get-runtime-status
tar följande parametrar:
id
(krävs): ID för orkestreringsinstansen.show-input
(valfritt): Om värdet är inställttrue
på innehåller svaret indata för funktionen. Standardvärdet ärfalse
.show-output
(valfritt): Om värdet är inställt påtrue
innehåller svaret utdata för funktionen. Standardvärdet ärfalse
.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet ärDurableFunctionsHub
. Den kan också anges i host.json med durableTask:HubName.
Följande kommando hämtar statusen (inklusive indata och utdata) för en instans med ett orkestreringsinstans-ID för 0ab8c55a66644d68a3a8b220b12d209c. Det förutsätter att du kör func
kommandot från funktionsappens rotkatalog:
func durable get-runtime-status --id 0ab8c55a66644d68a3a8b220b12d209c --show-input true --show-output true
Du kan använda durable get-history
kommandot för att hämta historiken för en orkestreringsinstans. Det tar följande parametrar:
id
(krävs): ID för orkestreringsinstansen.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet ärDurableFunctionsHub
. Den kan också anges i host.json med durableTask:HubName.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c
Fråga alla instanser
Du kan använda API:er i ditt språk-SDK för att fråga efter status för alla orkestreringsinstanser i aktivitetshubben. Det här "list-instances" eller "get-status" -API:et returnerar en lista över objekt som representerar orkestreringsinstanserna som matchar frågeparametrarna.
[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.
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
Azure Functions Core Tools
Det är också möjligt att fråga instanser direkt med hjälp func durable get-instances
av kommandot i Core Tools.
Kommentar
Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Kommandot durable get-instances
tar följande parametrar:
top
(valfritt): Det här kommandot stöder växling. Den här parametern motsvarar antalet instanser som hämtats per begäran. Standardvärdet är 10.continuation-token
(valfritt): En token som anger vilken sida eller vilket avsnitt av instanser som ska hämtas. Varjeget-instances
körning returnerar en token till nästa uppsättning instanser.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet ärDurableFunctionsHub
. Den kan också anges i host.json med durableTask:HubName.
func durable get-instances
Fråga instanser med filter
Vad händer om du inte behöver all information som en standardinstansfråga kan ge? Vad händer om du till exempel bara letar efter orkestreringsgenereringstiden eller orkestreringskörningsstatusen? Du kan begränsa frågan genom att använda filter.
[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));
}
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
Azure Functions Core Tools
I Azure Functions Core Tools kan du också använda durable get-instances
kommandot med filter. Förutom de ovan nämnda top
parametrarna , continuation-token
, connection-string-setting
och task-hub-name
kan du använda tre filterparametrar (created-after
, created-before
och runtime-status
).
Kommentar
Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Följande är parametrarna durable get-instances
för kommandot.
created-after
(valfritt): Hämta de instanser som skapats efter detta datum/tid (UTC). ISO 8601-formaterade datetimes accepteras.created-before
(valfritt): Hämta de instanser som skapats före detta datum/tid (UTC). ISO 8601-formaterade datetimes accepteras.runtime-status
(valfritt): Hämta instanserna med en viss status (till exempel köra eller slutförda). Kan ge flera (blankstegsavgränsade) statusar.top
(valfritt): Antal instanser som hämtats per begäran. Standardvärdet är 10.continuation-token
(valfritt): En token som anger vilken sida eller vilket avsnitt av instanser som ska hämtas. Varjeget-instances
körning returnerar en token till nästa uppsättning instanser.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet ärDurableFunctionsHub
. Den kan också anges i host.json med durableTask:HubName.
Om du inte anger några filter (created-after
, created-before
eller runtime-status
) hämtar top
kommandot bara instanser, utan hänsyn till körningsstatus eller skapandetid.
func durable get-instances --created-after 2021-03-10T13:57:31Z --created-before 2021-03-10T23:59Z --top 15
Avsluta instanser
Om du har en orkestreringsinstans som tar för lång tid att köra, eller om du bara behöver stoppa den innan den slutförs av någon anledning, kan du avsluta den.
De två parametrarna för termins-API:et är ett instans-ID och en orsakssträng som skrivs till loggar och till instansstatusen.
[FunctionName("TerminateInstance")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("terminate-queue")] string instanceId)
{
string reason = "Found a bug";
return client.TerminateAsync(instanceId, reason);
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
En avslutad instans övergår så småningom till tillståndet Terminated
. Den här övergången sker dock inte omedelbart. I stället placeras avsluta-åtgärden i aktivitetshubben tillsammans med andra åtgärder för den instansen. Du kan använda API:erna för instansfrågor för att veta när en avslutad instans faktiskt har nått Terminated
tillståndet.
Kommentar
Instansavslut sprids för närvarande inte. Aktivitetsfunktioner och underorkestreringar körs till slutförande, oavsett om du har avslutat orkestreringsinstansen som anropade dem.
Pausa och återuppta instanser
Om du pausar en orkestrering kan du stoppa en orkestrering som körs. Till skillnad från avslutning har du möjlighet att återuppta en pausad orkestrerare vid en senare tidpunkt.
De två parametrarna för det pausade API:et är ett instans-ID och en orsakssträng som skrivs till loggar och till instansstatusen.
[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);
}
En pausad instans övergår så småningom till tillståndet Suspended
. Den här övergången sker dock inte omedelbart. I stället placeras pausåtgärden i kö i aktivitetshubben tillsammans med andra åtgärder för den instansen. Du kan använda api:erna för instansfrågor för att veta när en instans som körs faktiskt har nått tillståndet Pausat.
När en pausad orkestrerare återupptas ändras dess status tillbaka till Running
.
Azure Functions Core Tools
Du kan också avsluta en orkestreringsinstans direkt med hjälp func durable terminate
av kommandot i Core Tools.
Kommentar
Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Kommandot durable terminate
tar följande parametrar:
id
(krävs): ID för orkestreringsinstansen som ska avslutas.reason
(valfritt): Orsak till uppsägning.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet ärDurableFunctionsHub
. Den kan också anges i host.json med durableTask:HubName.
Följande kommando avslutar en orkestreringsinstans med ett ID för 0ab8c55a66644d68a3a8b220b12d209c:
func durable terminate --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Found a bug"
Skicka händelser till instanser
I vissa scenarier måste orkestreringsfunktioner vänta och lyssna efter externa händelser. Exempelscenarier där detta är användbart är scenarier för övervakning och mänsklig interaktion .
Du kan skicka händelsemeddelanden till instanser som körs med hjälp av api:et för att skapa händelse i orkestreringsklienten. Orkestreringar kan lyssna och svara på dessa händelser med hjälp av väntan på extern händelseorkestrerings-API .
Parametrarna för höjningshändelsen är följande:
- Instans-ID: Instansens unika ID.
- Händelsenamn: Namnet på den händelse som ska skickas.
- Händelsedata: En JSON-serialiserbar nyttolast som ska skickas till instansen.
[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);
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
Kommentar
Om det inte finns någon orkestreringsinstans med det angivna instans-ID:t ignoreras händelsemeddelandet. Om det finns en instans men den ännu inte väntar på händelsen lagras händelsen i instanstillståndet tills den är redo att tas emot och bearbetas.
Azure Functions Core Tools
Du kan också skapa en händelse till en orkestreringsinstans direkt med hjälp func durable raise-event
av kommandot i Core Tools.
Kommentar
Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Kommandot durable raise-event
tar följande parametrar:
id
(krävs): ID för orkestreringsinstansen.event-name
: Namnet på händelsen som ska genereras.event-data
(valfritt): Data som ska skickas till orkestreringsinstansen. Det kan vara sökvägen till en JSON-fil, eller så kan du ange data direkt på kommandoraden.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Standardvärdet ärDurableFunctionsHub
. Den kan också anges i host.json med 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
Vänta tills orkestrering har slutförts
I långvariga orkestreringar kanske du vill vänta och få resultatet av en orkestrering. I dessa fall är det också användbart att kunna definiera en tidsgräns för orkestreringen. Om tidsgränsen överskrids ska orkestreringens tillstånd returneras i stället för resultatet.
API:et "vänta på slutförande eller skapa kontrollstatussvar" kan användas för att hämta faktiska utdata från en orkestreringsinstans synkront. Som standard har den här metoden en standardtimeout på 10 sekunder och ett avsökningsintervall på 1 sekund.
Här är ett exempel på en HTTP-utlösarfunktion som visar hur du använder det här API:et:
// 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));
}
}
}
Anropa funktionen med följande rad. Använd 2 sekunder för tidsgränsen och 0,5 sekunder för återförsöksintervallet:
curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"
Kommentar
Ovanstående cURL-kommando förutsätter att du har en orchestrator-funktion med namnet E1_HelloSequence
i projektet. På grund av hur HTTP-utlösarfunktionen skrivs kan du ersätta den med namnet på valfri orkestreringsfunktion i projektet.
Beroende på den tid som krävs för att hämta svaret från orkestreringsinstansen finns det två fall:
- Orkestreringsinstanserna slutförs inom den definierade tidsgränsen (i det här fallet 2 sekunder) och svaret är den faktiska orkestreringsinstansens utdata, som levereras synkront:
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!"
]
- Orkestreringsinstanserna kan inte slutföras inom den definierade tidsgränsen och svaret är standardvärdet som beskrivs i HTTP API URL-identifiering:
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}"
}
Kommentar
Formatet på webhook-URL:erna kan variera beroende på vilken version av Azure Functions-värden du kör. Föregående exempel är för Azure Functions 3.0-värden.
Hämta HTTP-hanteringswebbhooks-URL:er
Du kan använda ett externt system för att övervaka eller för att skapa händelser till en orkestrering. Externa system kan kommunicera med Durable Functions via webhook-URL:er som ingår i standardsvaret som beskrivs i HTTP API URL-identifiering. Webhook-URL:erna kan också nås programmatiskt med hjälp av orkestreringsklientbindningen. Mer specifikt kan API:et skapa HTTP-hanteringsnyttolast användas för att hämta ett serialiserbart objekt som innehåller dessa webhook-URL:er.
API:et för att skapa HTTP-hanteringsnyttolast har en parameter:
- Instans-ID: Instansens unika ID.
Metoderna returnerar ett objekt med följande strängegenskaper:
- ID: Instans-ID för orkestreringen (bör vara samma som
InstanceId
indata). - StatusQueryGetUri: Status-URL:en för orkestreringsinstansen.
- SendEventPostUri: URL:en "raise event" för orkestreringsinstansen.
- TerminatePostUri: URL:en "avsluta" för orkestreringsinstansen.
- PurgeHistoryDeleteUri: URL:en för "rensningshistorik" för orkestreringsinstansen.
- suspendPostUri: URL:en "pausa" för orkestreringsinstansen.
- resumePostUri: URL:en "återuppta" för orkestreringsinstansen.
Funktioner kan skicka instanser av dessa objekt till externa system för att övervaka eller skapa händelser på motsvarande orkestreringar, enligt följande exempel:
[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 };
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda DurableActivityContext
i stället för IDurableActivityContext
, du måste använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
Spola tillbaka instanser (förhandsversion)
Om du har ett orkestreringsfel av en oväntad anledning kan du spola tillbaka instansen till ett tidigare felfritt tillstånd med hjälp av ett API som skapats för detta ändamål.
Kommentar
Det här API:et är inte avsett att ersätta korrekt felhantering och återförsöksprinciper. I stället är det avsett att endast användas i fall där orkestreringsinstanser misslyckas av oväntade skäl. Orkestreringar i andra tillstånd än Failed
(t.ex. , Running
, Terminated
Pending
, ) Completed
kan inte "återskapas". Mer information om felhantering och återförsöksprinciper finns i artikeln Felhantering .
RewindAsync
Använd metoden (.NET) eller rewind
(JavaScript) för orkestreringsklientbindningen för att återställa orkestreringen till körningstillståndet. Den här metoden kör även om de aktivitets- eller underorkestreringskörningsfel som orsakade orkestreringsfelet.
Anta till exempel att du har ett arbetsflöde som omfattar en rad mänskliga godkännanden. Anta att det finns en serie aktivitetsfunktioner som meddelar någon att deras godkännande behövs och väntar ut realtidssvaret. När alla godkännandeaktiviteter har fått svar eller överskriden tidsgräns antar du att en annan aktivitet misslyckas på grund av en programfelkonfiguration, till exempel en ogiltig databas anslutningssträng. Resultatet är ett orkestreringsfel djupt in i arbetsflödet. Med API:et RewindAsync
(.NET) eller rewind
(JavaScript) kan en programadministratör åtgärda konfigurationsfelet och spola tillbaka den misslyckade orkestreringen till tillståndet omedelbart före felet. Inget av stegen för mänsklig interaktion behöver godkännas på nytt och orkestreringen kan nu slutföras.
Kommentar
Återspolningsfunktionen har inte stöd för att spola tillbaka orkestreringsinstanser som använder varaktiga timers.
[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);
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
Azure Functions Core Tools
Du kan också spola tillbaka en orkestreringsinstans direkt med hjälp func durable rewind
av kommandot i Core Tools.
Kommentar
Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Kommandot durable rewind
tar följande parametrar:
id
(krävs): ID för orkestreringsinstansen.reason
(valfritt): Orsak till att orkestreringsinstansen spolas tillbaka.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Som standard används namnet på aktivitetshubben i host.json-filen.
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."
Rensa instanshistorik
Om du vill ta bort alla data som är associerade med en orkestrering kan du rensa instanshistoriken. Du kanske till exempel vill ta bort alla lagringsresurser som är associerade med en slutförd instans. Det gör du genom att använda rensningsinstans-API:et som definierats av orkestreringsklienten.
Det här första exemplet visar hur du rensar en enda orkestreringsinstans.
[FunctionName("PurgeInstanceHistory")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("purge-queue")] string instanceId)
{
return client.PurgeInstanceHistoryAsync(instanceId);
}
I nästa exempel visas en timerutlöst funktion som rensar historiken för alla orkestreringsinstanser som har slutförts efter det angivna tidsintervallet. I det här fallet tar den bort data för alla instanser som slutfördes för 30 dagar sedan. Den här exempelfunktionen är schemalagd att köras en gång per dag kl. 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
});
}
Kommentar
Den tidigare C#-koden är för Durable Functions 2.x. För Durable Functions 1.x måste du använda OrchestrationClient
attributet i stället för DurableClient
attributet och du måste använda DurableOrchestrationClient
parametertypen i stället för IDurableOrchestrationClient
. Mer information om skillnaderna mellan versioner finns i artikeln Durable Functions-versioner .
Kommentar
För att rensningshistoriken ska lyckas måste körningsstatusen för målinstansen vara Slutförd, Avslutad eller Misslyckad.
Azure Functions Core Tools
Du kan rensa orkestreringsinstansens historik med hjälp func durable purge-history
av kommandot i Core Tools. I likhet med det andra C#-exemplet i föregående avsnitt rensas historiken för alla orkestreringsinstanser som skapats under ett angivet tidsintervall. Du kan ytterligare filtrera rensade instanser efter körningsstatus.
Kommentar
Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Kommandot durable purge-history
har flera parametrar:
created-after
(valfritt): Rensa historiken för instanser som skapats efter detta datum/tid (UTC). ISO 8601-formaterade datetimes accepteras.created-before
(valfritt): Rensa historiken för instanser som skapats före detta datum/tid (UTC). ISO 8601-formaterade datetimes accepteras.runtime-status
(valfritt): Rensa historiken för instanser med en viss status (till exempel att köra eller slutföra). Kan ge flera (blankstegsavgränsade) statusar.connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Som standard används namnet på aktivitetshubben i host.json-filen.
Följande kommando tar bort historiken för alla misslyckade instanser som skapades före den 14 november 2021 kl. 19:35 (UTC).
func durable purge-history --created-before 2021-11-14T19:35:00.0000000Z --runtime-status failed
Ta bort en aktivitetshubb
func durable delete-task-hub
Med kommandot i Core Tools kan du ta bort alla lagringsartefakter som är associerade med en viss aktivitetshubb, inklusive Azure-lagringstabeller, köer och blobar.
Kommentar
Core Tools-kommandona stöds för närvarande endast när azure storage-standardprovidern används för att bevara körningstillståndet.
Kommandot durable delete-task-hub
har två parametrar:
connection-string-setting
(valfritt): Namnet på programinställningen som innehåller lagringen anslutningssträng att använda. Standardvärdet ärAzureWebJobsStorage
.task-hub-name
(valfritt): Namnet på uppgiftshubben Durable Functions som ska användas. Som standard används namnet på aktivitetshubben i host.json-filen.
Följande kommando tar bort alla Azure Storage-data som är associerade med UserTest
aktivitetshubben.
func durable delete-task-hub --task-hub-name UserTest