Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Durable Functions menyediakan timer durable untuk digunakan dalam fungsi orkestrator untuk menerapkan penundaan atau untuk menyiapkan batas waktu pada tindakan asinkron. Gunakan timer yang tahan lama dalam fungsi orkestrator alih-alih sleep atau delay API yang mungkin sudah ada dalam bahasa.
SDK Tugas Tahan Lama menyediakan timer tahan lama untuk digunakan dalam orkestrasi untuk menerapkan penundaan atau untuk menyiapkan batas waktu pada tindakan asinkron. Gunakan timer yang tahan lama dalam orkestrasi alih-alih sleep atau delay API yang mungkin sudah terintegrasi ke dalam bahasa.
Penting
Saat ini, PowerShell Durable Task SDK tidak tersedia.
Timer tahan lama adalah tugas yang dibuat menggunakan API create timer yang sesuai untuk bahasa yang tersedia, seperti yang ditunjukkan dalam contoh berikut dan mengambil waktu jatuh tempo atau durasi sebagai argumen.
// Put the orchestrator to sleep for 72 hours
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
await context.CreateTimer(dueTime, CancellationToken.None);
// Put the orchestration to sleep for 72 hours
await context.CreateTimer(TimeSpan.FromHours(72), CancellationToken.None);
Saat Anda await tugas timer, fungsi orkestrator berhenti sejenak sampai waktu kedaluwarsa yang telah ditentukan.
Ketika Anda await tugas timer, orkestrasi berhenti sampai waktu berakhir yang ditentukan.
Nota
Orkestrasi terus memproses peristiwa masuk lainnya sambil menunggu tugas timer kedaluwarsa.
Batasan timer tahan lama
Saat Anda membuat timer yang kedaluwarsa pada pukul 16.30 UTC, Kerangka Kerja Tugas Tahan Lama yang mendasar mengantrekan pesan yang hanya terlihat pada pukul 16.30 UTC. Jika aplikasi fungsi diskalakan ke nol instans sementara itu, pesan timer yang baru terlihat memastikan bahwa aplikasi fungsi diaktifkan lagi pada VM yang sesuai.
Nota
- Untuk aplikasi JavaScript, Python, dan PowerShell, timer tahan lama dibatasi hingga enam hari. Untuk mengatasi batasan ini, gunakan API timer dalam perulangan
whileuntuk mensimulasikan penundaan yang lebih lama. Aplikasi .NET dan Java terbaru mendukung timer dengan durasi yang dapat diatur sesuka hati. - Tergantung pada versi SDK dan penyedia penyimpanan yang digunakan, timer panjang enam hari atau lebih mungkin diterapkan secara internal menggunakan serangkaian timer yang lebih singkat (misalnya, durasi tiga hari) hingga waktu kedaluwarsa yang diinginkan tercapai. Perilaku ini dapat diamati di penyimpanan data yang mendasar tetapi tidak memengaruhi perilaku orkestrasi.
- Jangan gunakan API tanggal/waktu bawaan untuk mendapatkan waktu saat ini. Saat menghitung tanggal kedaluwarsa timer di masa depan, selalu gunakan API waktu saat ini dari fungsi orkestrator. Untuk informasi selengkapnya, lihat artikel Batasan kode fungsi orkestrator.
Saat Anda membuat timer yang kedaluwarsa pada pukul 16.30 UTC, Kerangka Kerja Tugas Tahan Lama yang mendasar mengantrekan pesan yang hanya terlihat pada pukul 16.30 UTC. Pesan timer memastikan bahwa pekerja diaktifkan lagi ketika timer habis.
Nota
- Menentukan penundaan panjang (misalnya, penundaan beberapa hari atau lebih) dapat mengakibatkan pembuatan beberapa timer tahan lama yang dikelola secara internal. Kode orkestrasi tidak perlu menyadari perilaku ini. Namun, mungkin dapat diamati pada log framework dan status riwayat tersimpan.
- Jangan gunakan API tanggal dan waktu bawaan untuk mendapatkan waktu saat ini. Saat menghitung tanggal mendatang agar timer kedaluwarsa, selalu gunakan properti waktu konteks orkestrasi saat ini (seperti
context.CurrentUtcDateTimedi .NET,ctx.current_utc_datetimedi Python, atauctx.currentUtcDateTimedi JavaScript).
Gunakan timer tahan lama untuk penundaan
Contoh berikut menunjukkan cara menggunakan timer tahan lama untuk menunda eksekusi. Contohnya mengeluarkan 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");
}
}
Nota
Contoh C# sebelumnya menargetkan Durable Functions 2.x. Untuk Durable Functions 1.x, gunakan DurableOrchestrationContext alih-alih IDurableOrchestrationContext. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .
public class BillingIssuer : TaskOrchestrator<object?, string>
{
public override async Task<string> RunAsync(TaskOrchestrationContext context, object? input)
{
for (int i = 0; i < 10; i++)
{
await context.CreateTimer(TimeSpan.FromDays(1), CancellationToken.None);
await context.CallActivityAsync("SendBillingEvent");
}
return "done";
}
}
Peringatan
Hindari perulangan tak terbatas dalam fungsi orkestrator. Untuk informasi tentang cara menerapkan skenario perulangan tak terbatas dengan aman dan efisien, lihat Orkestrasi abadi.
Peringatan
Hindari perulangan tak terbatas dalam orkestrasi. Untuk informasi tentang cara menerapkan skenario perulangan tak terbatas dengan aman dan efisien, lihat Orkestrasi abadi.
Gunakan timer tahan lama untuk batas waktu
Contoh ini menunjukkan cara menggunakan timer tahan lama 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;
}
}
}
Nota
Contoh C# sebelumnya menargetkan Durable Functions 2.x. Untuk Durable Functions 1.x, gunakan DurableOrchestrationContext alih-alih IDurableOrchestrationContext. Untuk informasi selengkapnya tentang perbedaan antar versi, lihat artikel versi Durable Functions .
public class TryGetQuote : TaskOrchestrator<object?, bool>
{
public override async Task<bool> RunAsync(TaskOrchestrationContext context, object? input)
{
using var cts = new CancellationTokenSource();
Task<double> activityTask = context.CallActivityAsync<double>("GetQuote");
Task timeoutTask = context.CreateTimer(TimeSpan.FromSeconds(30), cts.Token);
Task winner = await Task.WhenAny(activityTask, timeoutTask);
if (winner == activityTask)
{
// success case
cts.Cancel();
return true;
}
else
{
// timeout case
return false;
}
}
}
Peringatan
Di .NET, JavaScript, Python, dan PowerShell, batalkan timer tahan lama yang dibuat jika kode Anda tidak menunggunya selesai. Lihat contoh sebelumnya tentang cara membatalkan timer yang tertunda. Kerangka Tugas Tahan Lama tidak mengubah status orkestrasi menjadi "Selesai" hingga semua tugas yang belum selesai, termasuk tugas timer yang tahan lama, baik diselesaikan maupun dibatalkan.
Peringatan
Jika SDK Anda mendukung pembatalan timer (misalnya, .NET), batalkan timer tahan lama yang dibuat jika kode Anda tidak menunggunya selesai. Lihat contoh sebelumnya tentang cara membatalkan timer yang tertunda. Kerangka Tugas Tahan Lama tidak mengubah status orkestrasi menjadi "Selesai" hingga semua tugas yang belum selesai, termasuk tugas timer yang tahan lama, baik diselesaikan maupun dibatalkan.
Mekanisme pembatalan ini menggunakan pola when-any yang tidak mengakhiri fungsi aktivitas yang sedang berjalan atau eksekusi sub-orkestrasi. Sebaliknya, itu hanya memungkinkan fungsi orkestrator mengabaikan hasilnya dan melanjutkan. Jika aplikasi fungsi Anda menggunakan paket Konsumsi, Anda masih ditagih untuk waktu dan memori yang dikonsumsi oleh fungsi aktivitas yang terbengkalai. Secara default, fungsi yang berjalan dalam paket Konsumsi memiliki batas waktu lima menit. Jika batas ini terlampaui, host Azure Functions akan memulai ulang untuk menghentikan semua proses eksekusi dan mencegah situasi penagihan yang tidak terkendali. Batas waktu fungsi dapat dikonfigurasi.
Untuk contoh yang lebih rinci tentang cara menerapkan batas waktu dalam fungsi orkestrator, lihat artikel Interaksi manusia .
Mekanisme pembatalan ini menggunakan pola when-any tidak mengakhiri aktivitas yang sedang berjalan atau eksekusi sub-orkestrasi. Sebaliknya, itu hanya memungkinkan orkestrasi mengabaikan hasilnya dan melanjutkan.