Bagikan melalui


Menangani kejadian eksternal di Durable Functions (Azure Functions)

Fungsi orkestrator memiliki kemampuan untuk menunggu dan mendengarkan kejadian eksternal. Fitur Durable Functions ini sering berguna untuk menangani interaksi manusia atau pemicu eksternal lainnya.

Catatan

Kejadian eksternal adalah operasi asinkron satu arah. Kejadian ini tidak cocok untuk situasi ketika klien yang mengirim kejadian membutuhkan respons sinkron dari fungsi orkestrator.

Menunggu kejadian

API "wait-for-external-event" dari pengikatan pemicu orkestrasi memungkinkan fungsi orkestrator menunggu dan mendengarkan peristiwa yang dikirimkan oleh klien eksternal secara asinkron. Fungsi orkestrator mendengarkan mendeklarasikan nama kejadian dan bentuk data yang diharapkan untuk diterima.

[FunctionName("BudgetApproval")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    bool approved = await context.WaitForExternalEvent<bool>("Approval");
    if (approved)
    {
        // approval granted - do the approved action
    }
    else
    {
        // approval denied - send a notification
    }
}

Catatan

Kode C# sebelumnya ditujukan 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.

Contoh sebelumnya mendengarkan kejadian tunggal tertentu dan mengambil tindakan saat diterima.

Anda dapat mendengarkan beberapa kejadian secara bersamaan, seperti dalam contoh berikut, yang menunggu salah satu dari tiga kemungkinan pemberitahuan kejadian.

[FunctionName("Select")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var event1 = context.WaitForExternalEvent<float>("Event1");
    var event2 = context.WaitForExternalEvent<bool>("Event2");
    var event3 = context.WaitForExternalEvent<int>("Event3");

    var winner = await Task.WhenAny(event1, event2, event3);
    if (winner == event1)
    {
        // ...
    }
    else if (winner == event2)
    {
        // ...
    }
    else if (winner == event3)
    {
        // ...
    }
}

Catatan

Kode C# sebelumnya ditujukan 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.

Contoh sebelumnya mendengarkan salah satu dari beberapa kejadian. Dimungkinkan juga untuk menunggu semua acara.

[FunctionName("NewBuildingPermit")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string applicationId = context.GetInput<string>();

    var gate1 = context.WaitForExternalEvent("CityPlanningApproval");
    var gate2 = context.WaitForExternalEvent("FireDeptApproval");
    var gate3 = context.WaitForExternalEvent("BuildingDeptApproval");

    // all three departments must grant approval before a permit can be issued
    await Task.WhenAll(gate1, gate2, gate3);

    await context.CallActivityAsync("IssueBuildingPermit", applicationId);
}

Catatan

Kode 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.

Dalam .NET, jika payload kejadian tidak dapat dikonversi ke jenis T yang diharapkan, pengecualian dilemparkan.

API "wait-for-external-event" menunggu tanpa batas waktu untuk beberapa input. Aplikasi fungsi dapat dibongkar dengan aman saat menunggu. Jika dan ketika kejadian tiba untuk instans orkestrasi ini, ini akan terbangun secara otomatis dan segera memproses kejadian.

Catatan

Jika aplikasi fungsi Anda menggunakan Paket Konsumsi, tidak ada biaya penagihan yang dikenakan saat fungsi orkestrator sedang menunggu tugas peristiwa eksternal, tidak peduli berapa lama menunggu.

Seperti halnya Fungsi Aktivitas, peristiwa eksternal memiliki jaminan pengiriman setidaknya sekali . Ini berarti bahwa, dalam kondisi tertentu (seperti menghidupkan ulang, penskalaan, crash, dll.), aplikasi Anda mungkin menerima duplikat dari peristiwa eksternal yang sama. Oleh karena itu, kami menyarankan agar peristiwa eksternal berisi semacam ID yang memungkinkannya diduplikasi secara manual di orkestrator.

Mengirim aktivitas

Anda dapat menggunakan API "raise-event" yang ditentukan oleh pengikatan klien orkestrasi untuk mengirim peristiwa eksternal ke orkestrasi. Anda juga dapat menggunakan API HTTP tingkatkan kejadian bawaan untuk mengirim kejadian eksternal ke orkestrasi.

Kejadian yang ditingkatkan mencakup ID instans, eventName, dan eventData sebagai parameter. Fungsi orkestrator menangani peristiwa ini menggunakan API "wait-for-external-event". eventName harus cocok pada ujung pengiriman dan penerimaan agar acara dapat diproses. Data kejadian juga harus dapat diserialisasikan oleh JSON.

Secara internal, mekanisme "raise-event" mengantrekan pesan yang diambil oleh fungsi orkestrator yang menunggu. Jika instans tidak menunggu di nama kejadian yang ditentukan, pesan kejadian ditambahkan ke antrean dalam memori. Jika instans orkestrasi selanjutnya mulai mendengarkan nama kejadian tersebut, ini akan memeriksa antrean untuk pesan kejadian.

Catatan

Jika tidak ada instans orkestrasi dengan ID instans yang ditentukan, pesan kejadian akan dibuang.

Di bawah ini adalah contoh fungsi yang dipicu antrean yang mengirimkan kejadian "Persetujuan" ke instans fungsi orkestrator. ID instans orkestrasi berasal dari isi pesan antrean.

[FunctionName("ApprovalQueueProcessor")]
public static async Task Run(
    [QueueTrigger("approval-queue")] string instanceId,
    [DurableClient] IDurableOrchestrationClient client)
{
    await client.RaiseEventAsync(instanceId, "Approval", true);
}

Catatan

Kode C# sebelumnya ditujukan untuk Durable Functions 2.x. Untuk Durable Functions 1.x, Anda harus menggunakan atribut OrchestrationClient, bukan atribut DurableClient, dan jenis parameter DurableOrchestrationClient, bukan IDurableOrchestrationClient. Untuk informasi selengkapnya tentang perbedaan antara versi, lihat artikel Versi Durable Functions.

Secara internal, API "raise-event" mengantrekan pesan yang diambil oleh fungsi orkestrator yang menunggu. Jika instans tidak menunggu nama kejadian, yang ditentukan, pesan peristiwa ditambahkan ke buffer dalam memori. Jika instans orkestrasi nantinya mulai mendengarkan nama peristiwa tersebut, instans tersebut akan memeriksa buffer untuk pesan peristiwa dan memicu tugas yang menunggunya.

Catatan

Jika tidak ada instans orkestrasi dengan ID instans yang ditentukan, pesan kejadian akan dibuang.

HTTP

Berikut adalah contoh permintaan HTTP yang menimbulkan kejadian "Persetujuan" ke instans orkestrasi.

POST /runtime/webhooks/durabletask/instances/MyInstanceId/raiseEvent/Approval&code=XXX
Content-Type: application/json

"true"

Dalam hal ini, ID instans di-hardcoded sebagai MyInstanceId.

Langkah berikutnya