Endlose Orchestrierungen in Durable Functions (Azure Functions)
Endlose Orchestrierungen sind Orchestratorfunktionen, die niemals enden. Sie sind nützlich, wenn Sie Durable Functions für Aggregatoren und Szenarien einsetzen möchten, für die eine Endlosschleife erforderlich ist.
Orchestrierungsverlauf
Wie im Thema Orchestrierungsverlauf beschrieben wird, verfolgt das Durable Task-Framework den Verlauf jeder einzelnen Funktionsorchestrierung nach. Dieser Verlauf nimmt ständig an Umfang zu, solange die Orchestratorfunktion neue Arbeit plant. Wenn die Orchestratorfunktion in eine Endlosschleife eintritt und fortlaufend Arbeit plant, kann dieser Verlauf eine kritische Größe erreichen und zu erheblichen Leistungsproblemen führen. Das Konzept der endlosen Orchestrierung wurde entworfen, um diese Art von Problemen für Anwendungen zu lösen, die Endlosschleifen benötigen.
Zurücksetzen und Neustarten
Anstatt Endlosschleifen zu verwenden, setzen Orchestratorfunktionen ihren Status zurück, indem sie die Methode continue-as-new in der Orchestrierungstriggerbindung aufrufen. Bei dieser Methode wird ein serialisierbarer JSON-Parameter verwendet, der zur neuen Eingabe für die nächste Generierung einer Orchestratorfunktion wird.
Wenn der Vorgang continue-as-new aufgerufen wird, startet die Orchestrationsinstanz mit dem neuen Eingabewert neu. Es wird dieselbe Instanz-ID beibehalten, aber der Verlauf der Orchestratorfunktion wird praktisch zurückgesetzt.
Hinweis
Das Durable Task Framework behält dieselbe Instanz-ID bei, aber intern wird eine neue Ausführungs-ID für die Orchestratorfunktion erstellt, die mit continue-as-new zurückgesetzt wird. Diese Ausführungs-ID wird im Allgemeinen nicht extern verfügbar gemacht, aber es kann hilfreich sein, sie zu kennen, wenn das Debuggen der Orchestrierungsausführung erfolgen soll.
Beispiel für regelmäßige Arbeit
Ein Anwendungsfall für endlose Orchestrierungen ist Code, der unendlich lange regelmäßig Arbeitsschritte ausführen muss.
[FunctionName("Periodic_Cleanup_Loop")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
await context.CallActivityAsync("DoCleanup", null);
// sleep for one hour between cleanups
DateTime nextCleanup = context.CurrentUtcDateTime.AddHours(1);
await context.CreateTimer(nextCleanup, CancellationToken.None);
context.ContinueAsNew(null);
}
Hinweis
Das vorherige C#-Beispiel gilt für Durable Functions 2.x. Für Durable Functions 1.x müssen Sie DurableOrchestrationContext
anstelle von IDurableOrchestrationContext
verwenden. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions-Versionen.
Der Unterschied zwischen diesem Beispiel und einer per Timer ausgelösten Funktion besteht darin, dass Bereinigungstriggerzeiten hier nicht auf einem Zeitplan basieren. Beispiel: Ein CRON-Zeitplan, für den stündlich eine Funktion ausgeführt wird (um 1:00, 2:00, 3:00 Uhr usw.), können ggf. Probleme mit Überlappungen auftreten. Wenn die Bereinigung in diesem Beispiel aber 30 Minuten dauert, wird sie um 1:00, 2:30, 4:00 Uhr usw. geplant, sodass es nicht zu Überlappungen kommt.
Starten einer endlosen Orchestrierung
Verwenden Sie die Methode start-new oder schedule-new, um eine ewige Orchestrierung zu starten, genauso wie bei jeder anderen Orchestrierungsfunktion.
Hinweis
Wenn Sie sicherstellen müssen, dass eine ewige Singleton-Orchestrierung ausgeführt wird, ist es wichtig, dass Sie beim Starten der Orchestrierung dieselbe id
der beibehalten. Weitere Informationen finden Sie unter Instanzverwaltung.
[FunctionName("Trigger_Eternal_Orchestration")]
public static async Task<HttpResponseMessage> OrchestrationTrigger(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage request,
[DurableClient] IDurableOrchestrationClient client)
{
string instanceId = "StaticId";
await client.StartNewAsync("Periodic_Cleanup_Loop", instanceId);
return client.CreateCheckStatusResponse(request, instanceId);
}
Hinweis
Der vorherige Code ist für Durable Functions 2.x vorgesehen. Für Durable Functions 1.x müssen Sie das OrchestrationClient
-Attribut anstelle des DurableClient
-Attributs verwenden, und Sie müssen den DurableOrchestrationClient
-Parametertyp anstelle von IDurableOrchestrationClient
verwenden. Weitere Informationen zu den Unterschieden zwischen den Versionen finden Sie im Artikel Durable Functions-Versionen.
Beenden einer endlosen Orchestrierung
Wenn eine Orchestratorfunktion schließlich abgeschlossen werden soll, müssen Sie lediglich nichtContinueAsNew
aufrufen und die Funktion enden lassen.
Wenn sich eine Orchestratorfunktion in einer Endlosschleife befindet und beendet werden muss, verwenden Sie die Beenden-API der Orchestrierungsclientbindung, um sie zu beenden. Weitere Informationen finden Sie unter Instanzverwaltung.