Orchestrations externes dans Fonctions durables (Azure Functions)

Les orchestrations externes sont des fonctions d’orchestrateur qui ne se terminent jamais. Elles sont utiles si vous souhaitez utiliser Fonctions Durable pour des agrégateurs et tout scénario qui nécessite une boucle infinie.

Historique d’orchestration

Comme expliqué dans la rubrique Historique d’orchestration, l’infrastructure Durable Task Framework effectue le suivi de l’historique de chaque orchestration de fonction. Cet historique augmente sans cesse tant que la fonction d’orchestrateur continue de planifier une nouvelle tâche. Si la fonction d’orchestrateur entre dans une boucle infinie et planifie sans cesse des tâches, cet historique risque de devenir très volumineux et de provoquer d’importants problèmes de performances. Le concept d’orchestration externe a été conçu pour limiter ces types de problèmes dans les applications nécessitant des boucles infinies.

Réinitialisation et redémarrage

Au lieu d'utiliser des boucles infinies, les fonctions de l'orchestrateur réinitialisent leur état en appelant la méthode continue-as-new de la liaison du déclencheur d’orchestration. Cette méthode utilise un paramètre JSON sérialisable, qui devient la nouvelle entrée de la prochaine génération de la fonction d’orchestrateur.

Lorsque continue-as-new est appelée, l'instance d'orchestration redémarre elle-même avec la nouvelle valeur d'entrée. Le même ID d’instance est conservé, mais l’historique de la fonction d’orchestrateur est réinitialisé.

Notes

L’infrastructure des tâches durables conserve le même ID d’instance, mais crée en interne un nouvel ID d’exécution pour la fonction d’orchestrateur réinitialisée par continue-as-new. Cet ID d’exécution n’est pas exposé en externe, mais il peut être utile d’en tenir compte lors du débogage de l’exécution d’orchestration.

Exemple de travail périodique

Voici un cas d’utilisation des orchestrations externes : un code a besoin d’effectuer un travail périodique indéfiniment.

[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);
}

Notes

L’exemple C# précédent porte sur Durable Functions 2.x. Pour Durable Functions 1.x, vous devez utiliser DurableOrchestrationContext au lieu de IDurableOrchestrationContext. Pour en savoir plus sur les différences entre les versions, consultez l’article Versions de Durable Functions.

La différence entre cet exemple et une fonction déclenchée par un minuteur est que les heures de déclenchement du nettoyage ne sont pas ici basées sur une planification. Par exemple, une planification CRON qui exécute une fonction toutes les heures se produira à 1 h 00, 2 h 00, 3 h 00 etc., et risque d’entraîner des problèmes de chevauchement. Mais dans cet exemple, si le nettoyage prend 30 minutes, il sera alors planifié à 1 h 00, 2 h 30, 4 h 00, etc., et il n’existe aucun risque de chevauchement.

Démarrage d’une orchestration externe

Utilisez la méthode durable du client start-new ou schedule-new pour démarrer une orchestration externe, comme vous le feriez pour toute autre fonction d’orchestration.

Notes

Si vous devez vous assurer qu’une orchestration externe singleton est en cours d’exécution, il est important de conserver le même id d’instance lors du démarrage de l’orchestration. Pour plus d’informations, consultez Gestion d’instance.

[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);
}

Notes

Le code précédent correspond à Durable Functions 2.x. Pour Durable Functions 1.x, vous devez utiliser l’attribut OrchestrationClient au lieu de l’attribut DurableClient, et vous devez utiliser le type de paramètre DurableOrchestrationClient au lieu de IDurableOrchestrationClient. Pour en savoir plus sur les différences entre les versions, consultez l’article Versions de Durable Functions.

Fermeture d’une orchestration externe

Si une fonction d’orchestrateur doit se terminer, il vous suffit de ne pas appeler ContinueAsNew et de laisser la fonction se terminer.

Si une fonction d’orchestrateur est dans une boucle infinie et doit être arrêtée, utilisez la méthode l’API terminate de la liaison du client d’orchestration pour l’arrêter. Pour plus d’informations, consultez Gestion d’instance.

Étapes suivantes