Bagikan melalui


Timer di Durable Functions (Azure Functions)

Durable Functions menyediakan timer durable untuk digunakan dalam fungsi orkestrator untuk menerapkan penundaan atau mengatur batas waktu pada tindakan asinkron. Timer tahan lama harus digunakan dalam fungsi orkestrator alih-alih API "tidur" atau "tunda" yang mungkin dibangun ke dalam bahasa.

Timer tahan lama adalah tugas yang dibuat menggunakan API "buat timer" yang sesuai untuk bahasa yang disediakan, seperti yang ditunjukkan di bawah, dan menggunakan waktu atau durasi sebagai argumen.

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

Saat Anda "menunggu" tugas timer, fungsi orkestrator akan tidur hingga waktu kedaluwarsa yang ditentukan.

Catatan

Orkestrasi akan terus memproses peristiwa masuk lainnya sambil menunggu tugas timer berakhir.

Batasan timer

Saat Anda membuat timer yang kedaluwarsa pada pukul 16:30 UTC, Kerangka Kerja Tahan Lama yang mendasari mengantrekan pesan yang hanya terlihat pada 16:30 UTC. Jika aplikasi fungsi diturunkan skalanya ke nol instans sementara itu, pesan timer yang baru terlihat akan memastikan bahwa aplikasi fungsi diaktifkan kembali pada mesin virtual yang sesuai.

Catatan

  • Untuk aplikasi JavaScript, Python, dan PowerShell, timer Durable dibatasi hingga enam hari. Untuk mengatasi batasan ini, Anda dapat menggunakan API timer dalam perulangan while untuk mensimulasikan penundaan yang lebih lama. Aplikasi .NET dan Java terbaru mendukung timer yang sangat panjang.
  • Tergantung pada versi SDK dan penyedia penyimpanan yang digunakan, timer panjang 6 hari atau lebih dapat diimplementasikan secara internal menggunakan serangkaian timer yang lebih singkat (misalnya, durasi 3 hari) hingga waktu kedaluwarsa yang diinginkan tercapai. Ini dapat diamati di penyimpanan data yang mendasar tetapi tidak akan berdampak pada perilaku orkestrasi.
  • Jangan gunakan API tanggal/waktu bawaan untuk mendapatkan waktu saat ini. Saat menghitung tanggal masa mendatang untuk timer kedaluwarsa, selalu gunakan API waktu saat ini fungsi orkestrator. Untuk informasi selengkapnya, lihat artikel Batasan kode fungsi orkestrator.

Penggunaan untuk penundaan

Contoh berikut ini menggambarkan cara menggunakan time durable untuk menunda eksekusi. Contohnya adalah menerbitkan pemberitahuan penagihan setiap hari selama 10 hari.

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

Catatan

Contoh C# sebelumnya menargetkan Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan DurableOrchestrationContext dan bukan IDurableOrchestrationContext. Untuk informasi selengkapnya tentang perbedaan antara versi, lihat artikel Versi Durable Functions.

Peringatan

Hindari perulangan tak terbatas dalam fungsi orkestrator. Untuk informasi tentang cara menerapkan skenario perulangan tanpa batas dengan aman dan efisien, lihat Eternal Orchestrations.

Penggunaan untuk batas waktu

Contoh ini menggambarkan cara menggunakan timer durable untuk menerapkan batas waktu.

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

Catatan

Contoh C# sebelumnya menargetkan Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan DurableOrchestrationContext dan bukan IDurableOrchestrationContext. Untuk informasi selengkapnya tentang perbedaan antara versi, lihat artikel Versi Durable Functions.

Peringatan

Di .NET, JavaScript, Python, dan PowerShell, Anda harus membatalkan timer tahan lama yang dibuat jika kode Anda tidak akan menunggu hingga selesai. Lihat contoh di atas tentang cara membatalkan timer yang tertunda. Durable Task Framework tidak akan mengubah status orkestrasi menjadi "Selesai" hingga semua tugas yang belum selesai, termasuk tugas timer tahan lama, diselesaikan atau dibatalkan.

Mekanisme pembatalan ini menggunakan pola when-any tidak menghentikan fungsi aktivitas yang sedang berlangsung atau eksekusi suborkestrasi. Sebaliknya, itu hanya memungkinkan fungsi orkestrator untuk mengabaikan hasil dan melanjutkan. Jika aplikasi fungsi Anda menggunakan paket Konsumsi, Anda masih akan ditagihkan untuk setiap waktu dan memori yang dikonsumsi oleh fungsi aktivitas yang ditinggalkan. Secara default, fungsi yang berjalan dalam paket Konsumsi memiliki batas waktu lima menit. Jika batas ini terlampaui, host Azure Functions didaur ulang untuk menghentikan semua eksekusi dan mencegah situasi penagihan tak terkendali. Batas waktu fungsi dapat dikonfigurasi.

Untuk contoh yang lebih mendalam tentang cara menerapkan batas waktu dalam fungsi orkestrator, lihat artikel Interaksi Manusia & Batas Waktu - Verifikasi Telepon.

Langkah berikutnya