Penyebaran waktu henti untuk Fungsi yang Tahan Lama
Model eksekusi andal dari Fungsi Tahan Lama mengharuskan orkestrasi bersifat deterministik, yang menciptakan tantangan tambahan untuk dipertimbangkan ketika Anda menyebarkan pembaruan. Saat penyebaran berisi perubahan pada tanda tangan fungsi aktivitas atau logika orkestrator, instans orkestrasi dalam penerbangan akan gagal. Situasi ini terutama menjadi masalah untuk instans orkestrasi yang berjalan lama, yang mungkin menunjukkan jam atau hari kerja.
Untuk mencegah kegagalan ini, Anda memiliki dua opsi:
- Tunda penyebaran Anda hingga semua instans orkestrasi yang berjalan telah selesai.
- Pastikan instans orkestrasi yang berjalan menggunakan versi fungsi Anda yang ada.
Bagan berikut membandingkan tiga strategi utama untuk mencapai penyebaran zero-downtime untuk Fungsi Tahan Lama:
Strategi | Kapan digunakan | Pro | Kontra |
---|---|---|---|
Penerapan Versi | Aplikasi yang tidak sering mengalami perubahan besar. | Mudah diterapkan. | Peningkatan ukuran aplikasi fungsi dalam memori dan jumlah fungsi. Duplikasi kode. |
Pemeriksaan status dengan slot | Sistem yang tidak memiliki orkestrasi jangka panjang yang berlangsung lebih dari 24 jam atau orkestrasi yang sering tumpang tindih. | Basis kode sederhana. Tidak memerlukan manajemen aplikasi fungsi tambahan. |
Membutuhkan akun penyimpanan tambahan atau manajemen hub tugas. Membutuhkan periode waktu ketika tidak ada orkestrasi yang berjalan. |
Perutean Aplikasi | Sistem yang tidak memiliki periode waktu saat orkestrasi tidak berjalan, seperti periode waktu dengan orkestrasi yang berlangsung lebih dari 24 jam atau dengan orkestrasi yang sering tumpang tindih. | Menangani versi sistem baru dengan orkestrasi yang terus berjalan yang memiliki perubahan besar. | Membutuhkan router aplikasi cerdas. Dapat memaksimalkan jumlah aplikasi fungsi yang diizinkan oleh langganan Anda. Nilai defaultnya adalah 100. |
Sisa dokumen ini menjelaskan strategi ini secara lebih detail.
Catatan
Deskripsi untuk strategi penerapan waktu henti nol ini mengasumsikan Anda menggunakan penyedia Azure Storage default untuk Durable Functions. Panduan ini mungkin tidak sesuai jika Anda menggunakan penyedia penyimpanan selain penyedia Azure Storage default. Untuk informasi selengkapnya tentang berbagai opsi penyedia penyimpanan dan bagaimana perbandingannya, lihat dokumentasi penyedia penyimpanan Durable Functions.
Penerapan versi
Tentukan versi baru fungsi Anda dan tinggalkan versi lama di aplikasi fungsi Anda. Seperti yang Anda lihat di diagram, versi fungsi menjadi bagian dari namanya. Karena versi fungsi sebelumnya dipertahankan, instans orkestrasi dalam penerbangan dapat terus mereferensikannya. Sementara itu, permintaan untuk instans orkestrasi baru memanggil versi terbaru, yang dapat direferensikan oleh fungsi klien orkestrasi Anda dari pengaturan aplikasi.
Dalam strategi ini, setiap fungsi harus disalin, dan referensinya ke fungsi lain harus diperbarui. Anda dapat membuatnya lebih mudah dengan menulis skrip. Berikut adalah proyek contoh dengan skrip migrasi.
Catatan
Strategi ini menggunakan slot penyebaran untuk menghindari waktu henti selama penyebaran. Untuk informasi lebih lanjut tentang cara membuat dan menggunakan slot penyebaran baru, lihat slot penyebaran Azure Functions.
Pemeriksaan status dengan slot
Saat versi aplikasi fungsi Anda saat ini berjalan di slot produksi Anda, sebarkan versi baru aplikasi fungsi Anda ke slot penahapan. Sebelum menukar slot produksi dan penahapan, periksa untuk melihat apakah ada instans orkestrasi yang berjalan. Setelah semua instans orkestrasi selesai, Anda dapat melakukan pertukaran. Strategi ini bekerja ketika Anda memiliki periode yang dapat diprediksi ketika tidak ada instans orkestrasi dalam penerbangan. Ini adalah pendekatan terbaik ketika orkestrasi Anda tidak berjalan lama dan ketika eksekusi orkestrasi Anda tidak sering tumpang tindih.
Konfigurasi aplikasi fungsi
Gunakan prosedur berikut untuk menyiapkan skenario ini.
Tambahkan slot penyebaran ke aplikasi fungsi Anda untuk penahapan dan produksi.
Untuk setiap slot, atur pengaturan aplikasi AzureWebJobsStorage ke string koneksi akun penyimpanan bersama. Untai koneksi akun penyimpanan ini digunakan oleh runtime Azure Functions untuk menyimpan dengan aman kunci akses fungsi.
Untuk setiap slot, buat pengaturan aplikasi baru, misalnya,
DurableManagementStorage
. Atur nilainya ke string koneksi dari akun penyimpanan yang berbeda. Akun penyimpanan ini digunakan oleh ekstensi Durable Functions untuk eksekusi andal. Gunakan akun penyimpanan terpisah untuk setiap slot. Jangan tandai pengaturan ini sebagai pengaturan slot penyebaran.Di bagian durableTask file host.json fungsi aplikasi Anda, tentukan
connectionStringName
(Tahan Lama 2.x) atauazureStorageConnectionStringName
(Tahan Lama 1.x) sebagai nama pengaturan aplikasi yang Anda buat di langkah 3.
Diagram berikut menunjukkan konfigurasi slot penyebaran dan akun penyimpanan yang dijelaskan. Dalam skenario potensi pra-penyebaran ini, versi 2 dari aplikasi fungsi berjalan di slot produksi, sementara versi 1 tetap di slot penahapan.
Contoh host.json
Fragmen JSON berikut adalah contoh pengaturan string koneksi di file host.json.
Functions 2.0
{
"version": 2.0,
"extensions": {
"durableTask": {
"hubName": "MyTaskHub",
"storageProvider": {
"connectionStringName": "DurableManagementStorage"
}
}
}
}
Functions 1.x
{
"durableTask": {
"azureStorageConnectionStringName": "DurableManagementStorage"
}
}
Konfigurasi alur CI/CD
Konfigurasikan alur CI/CD Anda untuk disebarkan hanya ketika aplikasi fungsi Anda tidak memiliki instans orkestrasi yang tertunda atau sedang berjalan. Saat Anda menggunakan Alur Azure, Anda dapat membuat fungsi yang memeriksa kondisi ini, seperti dalam contoh berikut:
[FunctionName("StatusCheck")]
public static async Task<IActionResult> StatusCheck(
[HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient client,
ILogger log)
{
var runtimeStatus = new List<OrchestrationRuntimeStatus>();
runtimeStatus.Add(OrchestrationRuntimeStatus.Pending);
runtimeStatus.Add(OrchestrationRuntimeStatus.Running);
var result = await client.ListInstancesAsync(new OrchestrationStatusQueryCondition() { RuntimeStatus = runtimeStatus }, CancellationToken.None);
return (ActionResult)new OkObjectResult(new { HasRunning = result.DurableOrchestrationState.Any() });
}
Selanjutnya, konfigurasikan gerbang penahapan untuk menunggu hingga tidak ada orkestrasi yang berjalan. Untuk informasi lebih lanjut, lihat Melepaskan kontrol penyebaran menggunakan gerbang
Alur Azure memeriksa aplikasi fungsi Anda untuk menjalankan instans orkestrasi sebelum penyebaran dimulai.
Sekarang versi baru aplikasi fungsi Anda akan disebarkan ke slot penahapan.
Terakhir, tukar slot.
Pengaturan aplikasi yang tidak ditandai sebagai pengaturan slot penyebaran juga ditukar, sehingga aplikasi versi 2 mempertahankan referensinya ke akun penyimpanan A. Karena kondisi orkestrasi dilacak di akun penyimpanan, orkestrasi apa pun yang berjalan pada aplikasi versi 2 akan terus berjalan di slot baru tanpa gangguan.
Untuk menggunakan akun penyimpanan yang sama pada kedua slot, Anda dapat mengubah nama hub tugas Anda. Dalam hal ini, Anda harus mengelola status slot dan pengaturan HubName aplikasi Anda. Untuk mempelajari lebih lanjut, lihat Hub tugas di Durable Functions.
Perutean aplikasi
Strategi ini adalah yang paling kompleks. Namun, strategi ini dapat digunakan untuk aplikasi fungsi yang tidak memiliki waktu antara menjalankan orkestrasi.
Untuk strategi ini, Anda harus membuat router aplikasi di depan Durable Functions Anda. Router ini dapat diterapkan dengan Durable Functions. Router memiliki tanggung jawab untuk:
- Menyebarkan aplikasi fungsi.
- Mengelola versi Durable Functions.
- Merutekan permintaan orkestrasi ke aplikasi fungsi.
Ketika pertama kali permintaan orkestrasi diterima, router akan melakukan tugas berikut:
- Membuat aplikasi fungsi baru di Azure.
- Menyebarkan kode aplikasi fungsi Anda ke aplikasi fungsi baru di Azure.
- Meneruskan permintaan orkestrasi ke aplikasi baru.
Router mengelola status versi kode aplikasi Anda yang diterapkan ke aplikasi fungsi di Azure.
Router mengarahkan permintaan penyebaran dan orkestrasi ke aplikasi fungsi yang sesuai berdasarkan versi yang dikirim dengan permintaan. Hal ini mengabaikan versi patch.
Saat anda menyebarkan versi baru aplikasi tanpa perubahan besar, anda dapat menambahkan versi patch. Router menyebar ke aplikasi fungsi yang ada dan mengirimkan permintaan untuk kode versi lama dan baru, yang dirutekan ke aplikasi fungsi yang sama.
Saat anda menyebarkan versi baru aplikasi tanpa perubahan besar, anda dapat menambahkan versi mayor atau minor. Kemudian router aplikasi membuat aplikasi fungsi baru di Azure, menyebarkannya, dan merutekan permintaan untuk versi baru aplikasi Anda ke aplikasi tersebut. Dalam diagram berikut, menjalankan orkestrasi pada versi 1.0.1 aplikasi tetap berjalan, tetapi permintaan untuk versi 1.1.0 dirutekan ke aplikasi fungsi baru.
Router memantau status orkestrasi pada versi 1.0.1 dan menghapus aplikasi setelah semua orkestrasi selesai.
Melacak pengaturan penyimpanan
Setiap aplikasi fungsi harus menggunakan antrean penjadwalan terpisah, mungkin di akun penyimpanan terpisah. Jika ingin membuat kueri semua instans orkestrasi di semua versi aplikasi, Anda dapat berbagi tabel instans dan riwayat di seluruh aplikasi fungsi Anda. Anda dapat berbagi tabel dengan mengonfigurasi pengaturan trackingStoreConnectionStringName
dan trackingStoreNamePrefix
di file pengaturan host.json sehingga semuanya menggunakan nilai yang sama.
Untuk informasi lebih lanjut, lihat Mengelola instans dalam Durable Functions di Azure.