Aracılığıyla paylaş


Dayanıklı İşlevler hatalarını işleme (Azure İşlevleri)

Dayanıklı İşlev düzenlemeleri kodda uygulanır ve programlama dilinin yerleşik hata işleme özelliklerini kullanabilir. Düzenlemelerinize hata işleme ve telafi eklemek için öğrenmeniz gereken yeni kavramlar yoktur. Ancak, bilmeniz gereken birkaç davranış vardır.

Not

Azure İşlevleri için Node.js programlama modelinin 4. sürümü genel kullanıma sunulmuştur. Yeni v4 modeli, JavaScript ve TypeScript geliştiricileri için daha esnek ve sezgisel bir deneyime sahip olacak şekilde tasarlanmıştır. Geçiş kılavuzunda v3 ile v4 arasındaki farklar hakkında daha fazla bilgi edinin.

Aşağıdaki kod parçacıklarında JavaScript (PM4), yeni deneyim olan programlama modeli V4'i belirtir.

Etkinlik işlevlerindeki hatalar

Bir etkinlik işlevinde oluşan herhangi bir özel durum orchestrator işlevine geri sıralanır ve olarak FunctionFailedExceptionoluşturulur. Orchestrator işlevinde gereksinimlerinize uygun hata işleme ve telafi kodu yazabilirsiniz.

Örneğin, bir hesaptan diğerine fon aktaran aşağıdaki orchestrator işlevini göz önünde bulundurun:

[FunctionName("TransferFunds")]
public static async Task Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var transferDetails = context.GetInput<TransferOperation>();

    await context.CallActivityAsync("DebitAccount",
        new
        {
            Account = transferDetails.SourceAccount,
            Amount = transferDetails.Amount
        });

    try
    {
        await context.CallActivityAsync("CreditAccount",
            new
            {
                Account = transferDetails.DestinationAccount,
                Amount = transferDetails.Amount
            });
    }
    catch (Exception)
    {
        // Refund the source account.
        // Another try/catch could be used here based on the needs of the application.
        await context.CallActivityAsync("CreditAccount",
            new
            {
                Account = transferDetails.SourceAccount,
                Amount = transferDetails.Amount
            });
    }
}

Not

Önceki C# örnekleri Dayanıklı İşlevler 2.x içindir. 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.

İlk CreditAccount işlev çağrısı başarısız olursa orchestrator işlevi, fonları kaynak hesaba geri yatırarak telafi eder.

Hatada otomatik yeniden deneme

Etkinlik işlevlerini veya alt düzenleme işlevlerini çağırdığınızda, otomatik bir yeniden deneme ilkesi belirtebilirsiniz. Aşağıdaki örnek, bir işlevi en fazla üç kez çağırmayı dener ve her yeniden deneme arasında 5 saniye bekler:

[FunctionName("TimerOrchestratorWithRetry")]
public static async Task Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var retryOptions = new RetryOptions(
        firstRetryInterval: TimeSpan.FromSeconds(5),
        maxNumberOfAttempts: 3);

    await context.CallActivityWithRetryAsync("FlakyFunction", retryOptions, null);

    // ...
}

Not

Önceki C# örnekleri Dayanıklı İşlevler 2.x içindir. 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.

Önceki örnekteki etkinlik işlevi çağrısı, otomatik yeniden deneme ilkesini yapılandırmak için bir parametre alır. Otomatik yeniden deneme ilkesini özelleştirmek için çeşitli seçenekler vardır:

  • En fazla deneme sayısı: En fazla deneme sayısı. 1 olarak ayarlanırsa yeniden deneme olmaz.
  • İlk yeniden deneme aralığı: İlk yeniden deneme girişiminden önce bek süre.
  • Geri alma katsayısı: Geri alma artış oranını belirlemek için kullanılan katsayı. Varsayılan değer 1'tir.
  • En fazla yeniden deneme aralığı: Yeniden deneme girişimleri arasında bek süre üst sınırı.
  • Yeniden deneme zaman aşımı: Yeniden denemeler yapmak için harcayacak en fazla süre. Varsayılan davranış, süresiz olarak yeniden denemektir.

Özel yeniden deneme işleyicileri

.NET veya Java kullanırken kodda yeniden deneme işleyicileri uygulama seçeneğiniz de vardır. Bildirim temelli yeniden deneme ilkeleri yeterince açıklayıcı olmadığında bu yararlı olur. Özel yeniden deneme işleyicilerini desteklemeyen diller için döngüleri, özel durum işlemeyi ve yeniden denemeler arasında gecikmeleri eklemek için zamanlayıcıları kullanarak yeniden deneme ilkeleri uygulama seçeneğiniz vardır.

RetryOptions retryOptions = new RetryOptions(
    firstRetryInterval: TimeSpan.FromSeconds(5),
    maxNumberOfAttempts: int.MaxValue)
    {
        Handle = exception =>
        {
            // True to handle and try again, false to not handle and throw.
            if (exception is TaskFailedException failure)
            {
                // Exceptions from TaskActivities are always this type. Inspect the
                // inner Exception to get more details.
            }

            return false;
        };
    }

await ctx.CallActivityWithRetryAsync("FlakeyActivity", retryOptions, null);

İşlev zaman aşımları

Tamamlanması çok uzun sürüyorsa bir düzenleyici işlevi içindeki işlev çağrısını bırakmak isteyebilirsiniz. Bunu bugün yapmak için uygun yol, aşağıdaki örnekte olduğu gibi "herhangi bir" görev seçici ile dayanıklı bir zamanlayıcı oluşturmaktır:

[FunctionName("TimerOrchestrator")]
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("FlakyFunction");
        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;
        }
    }
}

Not

Önceki C# örnekleri Dayanıklı İşlevler 2.x içindir. 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.

Not

Bu mekanizma aslında devam eden etkinlik işlevi yürütmesini sonlandırmaz. Bunun yerine, düzenleyici işlevinin sonucu yoksaymasına ve devam etmesine olanak tanır. Daha fazla bilgi için Zamanlayıcılar belgelerine bakın.

İşlenmeyen özel durumlar

Orchestrator işlevi işlenmeyen bir özel durumla başarısız olursa, özel durumun ayrıntıları günlüğe kaydedilir ve örnek bir Failed durumla tamamlar.

Sonraki adımlar