Minuteurs dans Fonctions durables (Azure Functions)

Fonctions durables fournit des minuteurs durables à utiliser dans les fonctions de l’orchestrateur pour implémenter des retards ou configurer des délais d’expiration sur des actions asynchrones. Les minuteurs durables doivent être utilisés dans les fonctions d’orchestrateur au lieu des API « sleep » ou « delay » qui peuvent être intégrées au langage.

Les minuteurs durables sont des tâches créées à l’aide de l’API « create timer » appropriée pour la langue fournie, comme indiqué ci-dessous, et prennent un délai d’échéance ou une durée en tant qu’argument.

// Put the orchestrator to sleep for 72 hours
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
await context.CreateTimer(dueTime, CancellationToken.None);

Lorsque vous attendez la fin de la tâche du minuteur, la fonction d’orchestrateur est mise en veille jusqu’à l’heure d’expiration spécifiée.

Notes

Les orchestrations continueront de traiter d’autres événements entrants en attendant l’expiration d’une tâche de minuteur.

Limitations des minuteurs

Lorsque vous créez un minuteur qui expire à 16:30, l’infrastructure des tâches durables sous-jacente empile un message qui devient uniquement visible à 16:30. Si l’application de fonction est mise à l’échelle jusqu’à zéro instances en attendant, le message du minuteur nouvellement visible garantit que l’application de fonction est à nouveau activée sur une machine virtuelle appropriée.

Notes

  • Pour les applications JavaScript, Python et PowerShell, les minuteurs durables sont limités à six jours. Pour contourner cette limitation, vous pouvez utiliser les API de minuteur dans une boucle while pour simuler un délai plus long. Les applications .NET et Java à jour prennent en charge des minuteurs arbitrairement longs.
  • En fonction de la version du SDK et du fournisseur de stockage que vous utilisez, des minuteurs longs de 6 jours ou plus peuvent être implémentés en interne à l’aide d’une série de minuteurs plus courts (par exemple, avec des durées de 3 jours) jusqu’à ce que le délai d’expiration souhaité soit atteint. Cela peut être observé dans le magasin de données sous-jacent, mais n'aura pas d'impact sur le comportement de l'orchestration.
  • N’utilisez pas les API de date/heure intégrées pour obtenir l’heure actuelle. Lors du calcul d’une date future pour qu’un minuteur expire, utilisez toujours l’API d’heure actuelle de la fonction d’orchestrateur. Pour plus d’informations, consultez l’article Contraintes du code des fonctions d’orchestrateur.

Utilisation des retards

L’exemple suivant montre comment utiliser des minuteurs durables pour retarder une exécution. Dans cet exemple, une notification de facturation est émise tous les jours pendant 10 jours.

[FunctionName("BillingIssuer")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    for (int i = 0; i < 10; i++)
    {
        DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromDays(1));
        await context.CreateTimer(deadline, CancellationToken.None);
        await context.CallActivityAsync("SendBillingEvent");
    }
}

Notes

L’exemple C# précédent cible 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.

Avertissement

Evitez les boucles infinies dans les fonctions de l’orchestrateur. Pour plus d’informations sur la façon d’implémenter efficacement et en toute sécurité des scénarios de boucles infinies, consultez Orchestrations externes.

Utilisation des délais d’expiration

Cet exemple montre comment utiliser des minuteurs durables pour implémenter des délais d’expiration.

[FunctionName("TryGetQuote")]
public static async Task<bool> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    TimeSpan timeout = TimeSpan.FromSeconds(30);
    DateTime deadline = context.CurrentUtcDateTime.Add(timeout);

    using (var cts = new CancellationTokenSource())
    {
        Task activityTask = context.CallActivityAsync("GetQuote");
        Task timeoutTask = context.CreateTimer(deadline, cts.Token);

        Task winner = await Task.WhenAny(activityTask, timeoutTask);
        if (winner == activityTask)
        {
            // success case
            cts.Cancel();
            return true;
        }
        else
        {
            // timeout case
            return false;
        }
    }
}

Notes

L’exemple C# précédent cible 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.

Avertissement

Dans .NET, JavaScript, Python et PowerShell, vous devez annuler les minuteurs durables créés si votre code n’attend pas qu’ils se terminent. Consultez les exemples ci-dessus pour savoir comment annuler des minuteurs en attente. L’infrastructure de tâches durables ne changera pas le statut d'une orchestration en « Terminée » jusqu'à ce que toutes les tâches en cours, y compris les tâches de minuteurs durables, soient terminées ou annulées.

Ce mécanisme d’annulation, qui utilise le modèle when-any, ne termine pas la fonction d’activité en cours ni les exécutions de sous-orchestrations. Il permet simplement à la fonction de l’orchestrateur d’ignorer le résultat et de continuer. Si votre application de fonction utilise le plan de consommation, vous serez toujours facturé pour le temps consacré et la mémoire consommée par la fonction d’activité abandonnée. Par défaut, les fonctions exécutées dans le plan de consommation ont un délai d’expiration de cinq minutes. Si cette limite est dépassée, l’hôte d’Azure Functions est recyclé pour arrêter toute exécution en cours et éviter toute facturation supplémentaire. Le délai d’expiration des fonctions est configurable.

Pour obtenir un exemple plus détaillé d’implémentation de délais d’expiration dans les fonctions de l’orchestrateur, consultez l’article Interaction humaine et délais d’expiration – Vérification par téléphone.

Étapes suivantes