Share via


Dayanıklı İşlevler'deki zamanlayıcılar (Azure İşlevleri)

Dayanıklı İşlevler, gecikmeleri uygulamak veya zaman uyumsuz eylemlerde zaman aşımlarını ayarlamak için düzenleyici işlevlerinde kullanılmak üzere dayanıklı zamanlayıcılar sağlar. Dayanıklı zamanlayıcılar, dilde yerleşik olarak bulunabilecek "uyku" veya "gecikme" API'leri yerine düzenleyici işlevlerinde kullanılmalıdır.

Dayanıklı zamanlayıcılar, aşağıda gösterildiği gibi sağlanan dil için uygun "zamanlayıcı oluşturma" API'si kullanılarak oluşturulan ve bağımsız değişken olarak bir süre veya süre alan görevlerdir.

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

Zamanlayıcı görevini "beklediğiniz" zaman, orchestrator işlevi belirtilen süre sonu süresine kadar uyku moduna girer.

Dekont

Zamanlayıcı görevinin süresinin dolması beklenirken, düzenleme işlemleri diğer gelen olayları işlemeye devam eder.

Süreölçer sınırlamaları

Utc saat 16:30'da süresi dolan bir süreölçer oluşturduğunuzda, temel alınan Dayanıklı Görev Çerçevesi yalnızca 16:30 UTC'de görünür hale gelen bir ileti sıralar. Bu sırada işlev uygulamasının ölçeği sıfır örneğe düşürüldüyse, yeni görünen zamanlayıcı iletisi işlev uygulamasının uygun bir VM'de yeniden etkinleştirilmesini sağlar.

Dekont

  • JavaScript, Python ve PowerShell uygulamaları için Dayanıklı zamanlayıcılar altı günle sınırlıdır. Bu sınırlamayı geçici olarak çözmek için, daha uzun bir gecikmenin benzetimini yapmak için döngüdeki while zamanlayıcı API'lerini kullanabilirsiniz. Güncel .NET ve Java uygulamaları rastgele uzun süreölçerleri destekler.
  • Kullanılan SDK ve depolama sağlayıcısının sürümüne bağlı olarak, istenen süre sonu zamanına ulaşılana kadar 6 gün veya daha uzun süreölçerler dahili olarak bir dizi daha kısa süreölçer (örneğin, 3 günlük süreler) kullanılarak uygulanabilir. Bu, temel alınan veri deposunda gözlemlenebilir ancak düzenleme davranışını etkilemez.
  • Geçerli saati almak için yerleşik tarih/saat API'lerini kullanmayın. Zamanlayıcının süresinin dolması için gelecekteki bir tarihi hesaplarken her zaman orchestrator işlevinin geçerli saat API'sini kullanın. Daha fazla bilgi için orchestrator işlev kodu kısıtlamaları makalesine bakın.

Gecikme için kullanım

Aşağıdaki örnekte, yürütmeyi geciktirmek için dayanıklı süreölçerlerin nasıl kullanılacağı gösterilmektedir. Örnek, 10 gün boyunca her gün bir faturalama bildirimi verme işlemidir.

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

Dekont

Önceki C# örneği 2.x Dayanıklı İşlevler hedeflemektedir. Dayanıklı İşlevler 1.x için yerine IDurableOrchestrationContextkullanmanız DurableOrchestrationContext gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Uyarı

Orchestrator işlevlerinde sonsuz döngülerden kaçının. Sonsuz döngü senaryolarını güvenli ve verimli bir şekilde uygulama hakkında bilgi için bkz . Eternal Orchestrations.

Zaman aşımı için kullanım

Bu örnekte, zaman aşımlarını uygulamak için dayanıklı zamanlayıcıların nasıl kullanılacağı gösterilmektedir.

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

Dekont

Önceki C# örneği 2.x Dayanıklı İşlevler hedeflemektedir. Dayanıklı İşlevler 1.x için yerine IDurableOrchestrationContextkullanmanız DurableOrchestrationContext gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Uyarı

.NET, JavaScript, Python ve PowerShell'de, kodunuz tamamlanmasını beklemiyorsa oluşturulan dayanıklı zamanlayıcıları iptal etmeniz gerekir. Bekleyen süreölçerleri iptal etme hakkında yukarıdaki örneklere bakın. Dayanıklı Görev Çerçevesi, dayanıklı zamanlayıcı görevleri de dahil olmak üzere tüm bekleyen görevler tamamlanana veya iptal edilene kadar düzenlemenin durumunu "Tamamlandı" olarak değiştirmez.

Herhangi bir zaman desenini kullanan bu iptal mekanizması devam eden etkinlik işlevini veya alt düzenleme yürütmelerini sonlandırmaz. Bunun yerine, orchestrator işlevinin sonucu yoksaymasına ve devam etmesine olanak tanır. İşlev uygulamanız Tüketim planını kullanıyorsa, bırakılan etkinlik işlevi tarafından tüketilen her zaman ve bellek için faturalandırılırsınız. Varsayılan olarak, Tüketim planında çalışan işlevlerin zaman aşımı beş dakikadır. Bu sınır aşılırsa, Azure İşlevleri ana bilgisayarı tüm yürütmeyi durdurmak ve bir kaçak faturalama durumunu önlemek için geri dönüştürülür. İşlev zaman aşımı yapılandırılabilir.

Orchestrator işlevlerinde zaman aşımlarını uygulama hakkında daha ayrıntılı bir örnek için İnsan Etkileşimi ve Zaman Aşımları - Telefon Doğrulama makalesine bakın.

Sonraki adımlar