Orkestrasi yang tahan lama

Durable Functions adalah ekstensi Azure Functions. Anda dapat menggunakan fungsi orkestrator untuk mengatur eksekusi fungsi Tahan Lama lainnya dalam aplikasi fungsi. Fungsi orkestrator memiliki karakteristik berikut:

  • Fungsi orkestrator mendefinisikan alur kerja fungsi menggunakan kode prosedural. Tidak diperlukan skema atau perancang deklaratif.
  • Fungsi orkestrator dapat memanggil fungsi tahan lama lainnya secara sinkron dan asinkron. Output dari fungsi yang dipanggil dapat disimpan dengan andal ke variabel lokal.
  • Fungsi orkestrator tahan lama dan dapat diandalkan. Kemajuan eksekusi secara otomatis di titik pemeriksaan ketika fungsi "menunggu" atau "menghasilkan". Status lokal tidak pernah hilang ketika proses mendaur ulang atau me-reboot komputer virtual.
  • Fungsi orkestrator dapat berjalan lama. Umur total instans orkestrasi bisa detik, hari, bulan, atau tidak pernah berakhir.

Artikel ini memberi Anda ringkasan tentang fungsi orkestrator dan bagaimana mereka dapat membantu Anda menyelesaikan berbagai tantangan pengembangan aplikasi. Jika Anda belum terbiasa dengan jenis fungsi yang tersedia di aplikasi Durable Functions, baca artikel Jenis Durable Functions terlebih dahulu.

Identitas orkestrasi

Setiap instans dari orkestrasi memiliki pengenal instans (juga dikenal sebagai ID instans). Secara default, setiap ID instans adalah GUID yang dibuat otomatis. Namun, ID instans juga dapat menjadi nilai string yang dihasilkan pengguna. Setiap ID instans orkestrasi harus unik dalam hub tugas.

Berikut ini adalah beberapa aturan tentang ID instans:

  • ID instans harus antara 1 dan 100 karakter.
  • ID instans tidak boleh dimulai dengan @.
  • ID instans tidak boleh berisi karakter /, \, #, atau ?.
  • ID instans tidak boleh berisi karakter kontrol.

Catatan

Biasanya disarankan untuk menggunakan ID instans yang dibuat secara otomatis jika memungkinkan. ID instans buatan pengguna ditujukan untuk skenario di mana terdapat pemetaan satu-ke-satu antara instans orkestrasi dan beberapa entitas eksternal khusus aplikasi, seperti pesanan pembelian atau dokumen.

Selain itu, penegakan aturan pembatasan karakter yang sebenarnya dapat bervariasi tergantung pada penyedia penyimpanan yang digunakan oleh aplikasi. Untuk memastikan perilaku dan kompatibilitas yang benar, sangat disarankan agar Anda mengikuti aturan ID instans yang tercantum sebelumnya.

ID instans orkestrasi adalah parameter yang diperlukan untuk sebagian besar operasi manajemen instans. Mereka juga penting untuk diagnostik, seperti mencari melalui data pelacakan orkestrasi di Application Insights untuk tujuan pemecahan masalah atau analitik. Untuk alasan ini, disarankan untuk menyimpan ID instans yang dihasilkan ke beberapa lokasi eksternal (misalnya, database atau log aplikasi) di mana mereka dapat dengan mudah direferensikan nanti.

Keandalan

Fungsi orkestrator dengan andal mempertahankan status eksekusi mereka dengan menggunakan pola desain sumber kejadian. Alih-alih secara langsung menyimpan keadaan orkestrasi saat ini, Kerangka Kerja Tugas Tahan Lama menggunakan penyimpanan khusus pelengkap untuk merekam serangkaian tindakan penuh yang dilakukan orkestrasi fungsi. Penyimpanan khusus pelengkap memiliki banyak keuntungan dibandingkan dengan "mencadangkan" status runtime penuh. Keuntungannya termasuk peningkatan performa, skalabilitas, dan responsivitas. Anda juga mendapatkan konsistensi akhir untuk data transaksional dan jejak audit penuh serta riwayat. Jejak audit mendukung tindakan kompensasi yang andal.

Durable Functions menggunakan sumber kejadian secara transparan. Di balik layar, operator await (C#) atau yield (JavaScript/Python) dalam fungsi orkestrator menghasilkan kontrol atas utas orkestrator kembali ke dispatcher Kerangka Kerja Tugas Tahan Lama. Dalam kasus Java, tidak ada kata kunci bahasa komputer khusus. Sebaliknya, memanggil .await() pada tugas akan mengembalikan kontrol ke dispatcher melalui kustom Throwable. Dispatcher kemudian melakukan tindakan baru yang dijadwalkan fungsi orkestrator (seperti memanggil satu atau lebih fungsi anak atau menjadwalkan timer yang tahan lama) ke penyimpanan. Tindakan penerapan transparan memperbarui riwayat eksekusi instans orkestrasi dengan menambahkan semua kejadian baru ke penyimpanan, seperti log tambahan saja. Demikian pula, tindakan penerapan membuat pesan di penyimpanan untuk menjadwalkan pekerjaan yang sebenarnya. Pada titik ini, fungsi orkestrator dapat dibongkar dari memori. Secara default, Durable Functions menggunakan Azure Storage sebagai penyimpanan status runtime-nya, tetapi penyedia penyimpanan lainnya juga didukung.

Ketika fungsi orkestrasi diberikan lebih banyak pekerjaan yang harus dilakukan (misalnya, pesan respons diterima atau timer yang tahan lama berakhir), orkestrator bangun dan menjalankan kembali seluruh fungsi dari awal untuk membangun kembali status lokal. Selama pemutaran ulang, jika kode mencoba memanggil fungsi (atau melakukan pekerjaan asinkron lainnya), Kerangka Kerja Tugas Tahan Lama berkonsultasi dengan riwayat eksekusi orkestrasi saat ini. Jika menemukan bahwa fungsi aktivitas telah dijalankan dan menghasilkan hasil, fungsi ini memutar ulang hasil fungsi tersebut dan kode orkestrator terus berjalan. Pemutaran ulang berlanjut hingga kode fungsi selesai atau sampai menjadwalkan pekerjaan asinkron baru.

Catatan

Agar pola pemutaran ulang bekerja dengan benar dan andal, kode fungsi orkestrator harus deterministik. Kode orkestrator non-deterministik dapat mengakibatkan kesalahan runtime atau perilaku tak terduga lainnya. Untuk informasi selengkapnya tentang pembatasan kode untuk fungsi orkestrator, lihat dokumentasi batasan kode fungsi orkestrator.

Catatan

Jika fungsi orkestrator memancarkan pesan log, perilaku pemutaran ulang dapat menyebabkan pesan log duplikat dipancarkan. Lihat topik Pengelogan untuk mempelajari selengkapnya tentang mengapa perilaku ini terjadi dan cara mengerjakannya.

Riwayat orkestrasi

Perilaku sumber kejadian dari Kerangka Kerja Tugas Tahan Lama digabungkan erat dengan kode fungsi orkestrator yang Anda tulis. Misalkan Anda memiliki fungsi orkestrator penautan aktivitas, seperti fungsi orkestrator berikut:

Catatan

Model pemrograman Node.js versi 4 untuk Azure Functions umumnya tersedia. Model v4 baru dirancang untuk memiliki pengalaman yang lebih fleksibel dan intuitif untuk pengembang JavaScript dan TypeScript. Pelajari selengkapnya tentang perbedaan antara v3 dan v4 dalam panduan migrasi.

Dalam cuplikan kode berikut, JavaScript (PM4) menunjukkan model pemrograman V4, pengalaman baru.

[FunctionName("HelloCities")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("SayHello", "London"));

    // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
    return outputs;
}

Kapan pun fungsi aktivitas dijadwalkan, Durable Task Framework memeriksa status eksekusi fungsi ke beberapa backend penyimpanan yang tahan lama (penyimpanan Azure Table secara default). Status inilah yang disebut sebagai riwayat orkestrasi.

Tabel riwayat

Secara umum, Kerangka Kerja Tugas Tahan Lama melakukan hal berikut di setiap titik pemeriksaan:

  1. Simpan riwayat eksekusi ke penyimpanan yang tahan lama.
  2. Membuat antrean pesan untuk fungsi yang ingin dipanggil oleh orkestrator.
  3. Membuat antrean pesan untuk orkestrator itu sendiri – misalnya, pesan timer yang tahan lama.

Setelah titik pemeriksaan selesai, fungsi orkestrator bebas untuk dihapus dari memori sampai ada lebih banyak pekerjaan yang harus dilakukan.

Catatan

Azure Storage tidak memberikan jaminan transaksional apa pun antara menyimpan data ke penyimpanan tabel dan antrean. Untuk menangani kegagalan, penyedia Durable Functions Azure Storage menggunakan pola konsistensi akhir. Pola-pola ini memastikan bahwa tidak ada data yang hilang jika ada crash atau hilangnya konektivitas di tengah titik pemeriksaan. Penyedia penyimpanan alternatif, seperti penyedia penyimpanan Durable Functions MSSQL, dapat memberikan jaminan konsistensi yang lebih kuat.

Setelah selesai, riwayat fungsi yang diperlihatkan sebelumnya terlihat seperti tabel berikut ini di Azure Table Storage (disingkat untuk tujuan ilustrasi):

PartitionKey (InstanceId) EventType Tanda Waktu Input Nama Hasil Keadaan
eaee885b ExecutionStarted 2021-05-05T18:45:28.852Z nihil HelloCities
eaee885b OrchestratorStarted 2021-05-05T18:45:32.362Z
eaee885b TaskScheduled 2021-05-05T18:45:32.670Z SayHello
eaee885b OrchestratorCompleted 2021-05-05T18:45:32.670Z
eaee885b TaskCompleted 2021-05-05T18:45:34.201Z """Hello Tokyo!"""
eaee885b OrchestratorStarted 2021-05-05T18:45:34.232Z
eaee885b TaskScheduled 2021-05-05T18:45:34.435Z SayHello
eaee885b OrchestratorCompleted 2021-05-05T18:45:34.435Z
eaee885b TaskCompleted 2021-05-05T18:45:34.763Z """Hello Seattle!"""
eaee885b OrchestratorStarted 2021-05-05T18:45:34.857Z
eaee885b TaskScheduled 2021-05-05T18:45:34.857Z SayHello
eaee885b OrchestratorCompleted 2021-05-05T18:45:34.857Z
eaee885b TaskCompleted 2021-05-05T18:45:34.919Z """Hello London!"""
eaee885b OrchestratorStarted 2021-05-05T18:45:35.032Z
eaee885b OrchestratorCompleted 2021-05-05T18:45:35.044Z
eaee885b ExecutionCompleted 2021-05-05T18:45:35.044Z "[""Hello Tokyo!"",""Hello Seattle!"",""Hello London!""]" Selesai

Beberapa catatan pada nilai kolom:

  • PartitionKey: Berisi ID instans orkestrasi.
  • EventType: Mewakili jenis kejadian. Anda dapat menemukan deskripsi terperinci tentang semua jenis peristiwa riwayat di sini.
  • Timestamp: Tanda waktu UTC dari riwayat kejadian.
  • Name: Nama fungsi yang dipanggil.
  • Input: Input fungsi berformat JSON.
  • Result: Output fungsi; yaitu, nilai pengembaliannya.

Peringatan

Meskipun berguna sebagai alat penelusuran kesalahan, jangan mengambil dependensi apa pun pada tabel ini. Ini dapat berubah seiring berkembangnya ekstensi Durable Functions.

Setiap kali fungsi dilanjutkan setelah menunggu tugas selesai, Durable Task Framework menjalankan ulang fungsi orkestrator dari awal. Pada setiap tayangan ulang, ini berkonsultasi dengan riwayat eksekusi untuk menentukan apakah tugas asinkron saat ini telah selesai. Jika riwayat eksekusi menunjukkan bahwa tugas telah selesai, kerangka kerja akan memutar ulang output dari tugas tersebut dan melanjutkan ke tugas berikutnya. Proses ini berlanjut hingga seluruh riwayat eksekusi diputar ulang. Setelah riwayat eksekusi saat ini diputar ulang, variabel lokal akan dipulihkan ke nilai sebelumnya.

Fitur dan pola

Bagian berikutnya menjelaskan fitur dan pola fungsi orkestrator.

Sub-orkestrasi

Fungsi orkestrator dapat memanggil fungsi aktivitas, tetapi juga fungsi orkestrator lainnya. Misalnya, Anda dapat membuat orkestrasi yang lebih besar dari pustaka fungsi orkestrator. Atau, Anda dapat menjalankan beberapa instans fungsi orkestrator secara paralel.

Untuk informasi selengkapnya dan contohnya, lihat artikel Sub-orkestrasi.

Timer tahan lama

Orkestrasi dapat menjadwalkan timer yang tahan lama untuk menerapkan penundaan atau menyiapkan penanganan waktu habis pada tindakan asinkron. Gunakan timer tahan lama dalam fungsi orkestrator alih-alih API "tidur" asli bahasa komputer.

Untuk informasi selengkapnya dan contohnya, lihat artikel Timer tahan lama.

Kejadian eksternal

Fungsi orkestrator dapat menunggu kejadian eksternal untuk memperbarui instans orkestrasi. Fitur Durable Functions ini sering berguna untuk menangani interaksi manusia atau panggilan balik eksternal lainnya.

Untuk informasi selengkapnya dan contohnya, lihat artikel Kejadian eksternal.

Penanganan kesalahan

Fungsi orkestrator dapat menggunakan fitur penanganan kesalahan dari bahasa pemrograman. Pola yang ada seperti try/catch didukung dalam kode orkestrasi.

Fungsi orkestrator juga dapat menambahkan kebijakan coba lagi ke fungsi aktivitas atau sub-orkestrator yang mereka panggil. Jika fungsi aktivitas atau sub-orkestrator gagal dengan pengecualian, kebijakan coba lagi yang ditentukan dapat secara otomatis menunda dan mencoba kembali eksekusi hingga beberapa waktu yang ditentukan.

Catatan

Jika ada pengecualian tidak tertangani dalam fungsi orkestrator, instans orkestrasi akan selesai dalam status Failed. Instans orkestrasi tidak dapat dicoba lagi setelah gagal.

Untuk informasi selengkapnya dan contohnya, lihat artikel Penanganan kesalahan.

Critical section (Durable Functions 2.x, saat ini hanya .NET)

Instans orkestrasi berutas tunggal sehingga tidak perlu khawatir tentang race condition dalam orkestrasi. Namun, race condition dimungkinkan ketika orkestrasi berinteraksi dengan sistem eksternal. Untuk mengurangi kondisi pacu saat berinteraksi dengan sistem eksternal, fungsi orkestrator dapat menentukan bagian kritis menggunakan metode LockAsync di .NET.

Sampel kode berikut menunjukkan fungsi orkestrator yang menentukan critical section. Ini memasuki critical section menggunakan metode LockAsync. Metode ini mengharuskan penerusan satu atau beberapa referensi ke Entitas Tahan Lama, yang mengelola status kunci dengan tahan lama. Hanya satu instans orkestrasi ini yang dapat menjalankan kode di critical section pada satu waktu.

[FunctionName("Synchronize")]
public static async Task Synchronize(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var lockId = new EntityId("LockEntity", "MyLockIdentifier");
    using (await context.LockAsync(lockId))
    {
        // critical section - only one orchestration can enter at a time
    }
}

LockAsync memperoleh kunci tahan lama dan mengembalikan IDisposableyang mengakhiri critical section saat dibuang. Hasil IDisposable dapat digunakan bersama dengan blok using untuk mendapatkan representasi sintaksis dari critical section. Ketika fungsi orkestra memasuki critical section, hanya satu instans yang dapat menjalankan blok kode tersebut. Instans lain yang mencoba memasuki critical section akan diblokir hingga instans sebelumnya keluar dari critical section.

Fitur critical section juga berguna untuk mengoordinasikan perubahan pada entitas yang tahan lama. Untuk informasi selengkapnya tentang critical section, lihat topik "Koordinasi Entitas" entitas Tahan Lama.

Catatan

Bagian penting tersedia di Durable Functions 2.0. Saat ini, hanya orkestrasi .NET in-proc yang mengimplementasikan fitur ini. Entitas dan bagian penting belum tersedia di Durable Functions untuk pekerja yang terisolasi dotnet.

Memanggil titik akhir HTTP (Durable Functions 2.x)

Fungsi orkestrator tidak diizinkan untuk melakukan I/O, seperti yang dijelaskan dalam batasan kode fungsi orkestrator. Solusi umum untuk batasan ini adalah menggabungkan kode apa pun yang perlu melakukan I/O dalam fungsi aktivitas. Orkestrasi yang berinteraksi dengan sistem eksternal sering menggunakan fungsi aktivitas untuk melakukan panggilan HTTP dan mengembalikan hasilnya ke orkestrasi.

Untuk menyederhanakan pola umum ini, fungsi orkestrator dapat menggunakan metode CallHttpAsync untuk memanggil API HTTP secara langsung.

[FunctionName("CheckSiteAvailable")]
public static async Task CheckSiteAvailable(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    Uri url = context.GetInput<Uri>();

    // Makes an HTTP GET request to the specified endpoint
    DurableHttpResponse response = 
        await context.CallHttpAsync(HttpMethod.Get, url);

    if ((int)response.StatusCode == 400)
    {
        // handling of error codes goes here
    }
}

Selain mendukung pola permintaan/respons dasar, metode ini mendukung penanganan otomatis pola polling HTTP 202 asinkron umum, dan juga mendukung autentikasi dengan layanan eksternal menggunakan Identitas Terkelola.

Untuk informasi selengkapnya dan untuk contoh terperinci, lihat artikel fitur HTTP.

Catatan

Membuat panggilan titik akhir HTTP langsung dari fungsi orkestrator tersedia dalam Durable Functions 2.0 ke atas.

Meneruskan beberapa parameter

Tidak dimungkinkan untuk meneruskan beberapa parameter ke fungsi aktivitas secara langsung. Rekomendasinya adalah meneruskan berbagai objek atau objek komposit.

Dalam .NET Anda juga dapat menggunakan objek ValueTuple. Sampel berikut menggunakan fitur baru ValueTuple yang ditambahkan dengan C# 7:

[FunctionName("GetCourseRecommendations")]
public static async Task<object> RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string major = "ComputerScience";
    int universityYear = context.GetInput<int>();

    object courseRecommendations = await context.CallActivityAsync<object>(
        "CourseRecommendations",
        (major, universityYear));
    return courseRecommendations;
}

[FunctionName("CourseRecommendations")]
public static async Task<object> Mapper([ActivityTrigger] IDurableActivityContext inputs)
{
    // parse input for student's major and year in university
    (string Major, int UniversityYear) studentInfo = inputs.GetInput<(string, int)>();

    // retrieve and return course recommendations by major and university year
    return new
    {
        major = studentInfo.Major,
        universityYear = studentInfo.UniversityYear,
        recommendedCourses = new []
        {
            "Introduction to .NET Programming",
            "Introduction to Linux",
            "Becoming an Entrepreneur"
        }
    };
}

Langkah berikutnya