Orkestrasi abadi dalam Durable Functions (Azure Functions)
Orkestrasi abadi adalah fungsi orkestrator yang tidak pernah berakhir. Orkestrasi ini berguna saat Anda ingin menggunakan Durable Functions untuk agregator dan skenario apa pun yang memerlukan perulangan tak terbatas.
Riwayat orkestrasi
Seperti yang dijelaskan dalam topik riwayat orkestrasi, Durable Task Framework melacak riwayat setiap orkestrasi fungsi. Riwayat ini terus berkembang selama fungsi orkestrator terus menjadwalkan pekerjaan baru. Jika fungsi orkestrator masuk ke perulangan tak terbatas dan terus menjadwalkan pekerjaan, riwayat ini dapat berkembang sangat besar dan menyebabkan masalah performa yang signifikan. Konsep orkestrasi abadi dirancang untuk menangani masalah semacam ini untuk aplikasi yang membutuhkan perulangan tak terbatas.
Mengatur ulang dan memulai ulang
Alih-alih menggunakan infinite loop, fungsi orchestrator mengatur ulang statusnya dengan memanggil metode continue-as-new dari pengikatan pemicu orkestrasi. Metode ini mengambil parameter JSON-serializable, yang menjadi input baru untuk generasi fungsi orkestrator berikutnya.
Ketika continue-as-new dipanggil, instans orkestrasi memulai ulang dirinya sendiri dengan nilai input baru. ID instans yang sama disimpan, tetapi histori fungsi orkestra disetel ulang.
Catatan
Kerangka Tugas Tahan Lama mempertahankan ID instans yang sama tetapi secara internal membuat ID eksekusi baru untuk fungsi orkestra yang disetel ulang oleh continue-as-new. ID eksekusi ini tidak diekspos secara eksternal, tetapi mungkin berguna untuk mengetahui saat mendebug eksekusi orkestrasi.
Contoh pekerjaan berkala
Satu kasus penggunaan orkestrasi abadi adalah kode yang perlu melakukan pekerjaan berkala tanpa batas waktu.
[FunctionName("Periodic_Cleanup_Loop")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
await context.CallActivityAsync("DoCleanup", null);
// sleep for one hour between cleanups
DateTime nextCleanup = context.CurrentUtcDateTime.AddHours(1);
await context.CreateTimer(nextCleanup, CancellationToken.None);
context.ContinueAsNew(null);
}
Catatan
Contoh C# sebelumnya adalah untuk 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.
Perbedaan antara contoh ini dan fungsi yang dipicu timer adalah bahwa waktu pemicu pembersihan di sini tidak didasarkan pada jadwal. Misalnya, jadwal CRON yang menjalankan fungsi setiap jam akan menjalankannya pada pukul 01.00, 02.00, 03.00 dst dan berpotensi mengalami masalah tumpang tindih. Namun, dalam contoh ini, jika pembersihan memakan waktu 30 menit, maka itu akan dijadwalkan pada 1:00, 2:30, 4:00, dll dan tidak ada kemungkinan tumpang tindih.
Memulai orkestrasi abadi
Gunakan metode klien tahan lama start-new atau schedule-new untuk memulai orkestrasi abadi, sama seperti fungsi orkestrasi lainnya.
Catatan
Jika Anda perlu memastikan bahwa orkestrasi abadi singleton berjalan, instans yang sama id
harus dipertahankan saat memulai orkestrasi. Untuk informasi selengkapnya, lihat Pengelolaan Instans.
[FunctionName("Trigger_Eternal_Orchestration")]
public static async Task<HttpResponseMessage> OrchestrationTrigger(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage request,
[DurableClient] IDurableOrchestrationClient client)
{
string instanceId = "StaticId";
await client.StartNewAsync("Periodic_Cleanup_Loop", instanceId);
return client.CreateCheckStatusResponse(request, instanceId);
}
Catatan
Kode sebelumnya adalah untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient
dan bukan atribut DurableClient
, serta Anda harus menggunakan jenis parameter DurableOrchestrationClient
dan bukan IDurableOrchestrationClient
. Untuk informasi selengkapnya tentang perbedaan antara versi, lihat artikel Versi Durable Functions.
Keluar dari orkestrasi abadi
Jika fungsi orkestrator pada akhirnya perlu diselesaikan, yang perlu dilakukan adalah tidak menggunakan ContinueAsNew
dan membiarkan fungsi keluar.
Jika fungsi orkestrator berada dalam loop tak terbatas dan perlu dihentikan, gunakan API terminate dari pengikatan klien orkestrasi untuk menghentikannya. Untuk informasi selengkapnya, lihat Pengelolaan Instans.