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.
Petunjuk / Saran
Konten ini adalah kutipan dari eBook, Merancang Aplikasi .NET Cloud Native untuk Azure, tersedia di .NET Docs atau sebagai PDF gratis yang dapat diunduh yang dapat dibaca secara offline.
Garis pertahanan pertama adalah ketahanan aplikasi.
Meskipun Anda dapat menginvestasikan cukup banyak waktu menulis kerangka kerja ketahanan Anda sendiri, produk tersebut sudah ada.
Polly adalah pustaka .NET yang komprehensif untuk ketahanan dan penanganan kesalahan sementara, yang memungkinkan pengembang untuk mengekspresikan kebijakan ketahanan secara lancar dan aman dalam pengaturan multithread. Polly menargetkan aplikasi yang dibangun dengan .NET Framework atau .NET 7. Tabel berikut ini menjelaskan fitur ketahanan, yang disebut policies, tersedia di Pustaka Polly. Mereka dapat diterapkan secara individual atau dikelompokkan bersama-sama.
| Kebijakan | Pengalaman |
|---|---|
| Coba Ulang | Mengonfigurasi operasi pengulangan pada operasi yang ditentukan. |
| Pemutus Sirkuit | Memblokir operasi yang diminta untuk periode yang telah ditentukan sebelumnya ketika kesalahan melebihi ambang batas yang dikonfigurasi |
| Jeda Waktu | Menentukan batas durasi waktu bagi penelepon untuk menunggu respons. |
| Sekat | Membatasi tindakan pada kumpulan sumber daya dengan ukuran tetap untuk mencegah panggilan yang gagal membanjiri sumber daya. |
| Tembolok | Menyimpan respons secara otomatis. |
| Pengembalian | Mendefinisikan perilaku terstruktur setelah kegagalan. |
Perhatikan bagaimana dalam gambar sebelumnya kebijakan resiliensi berlaku untuk pesan permintaan, baik dari klien eksternal maupun dari layanan back-end. Tujuannya adalah untuk mengkompensasi permintaan layanan yang mungkin sesaat tidak tersedia. Gangguan berumur pendek ini biasanya memanifestasikan dirinya dengan kode status HTTP yang ditunjukkan dalam tabel berikut.
| Kode Status HTTP | Penyebab |
|---|---|
| 404 | Tidak Ditemukan |
| 408 | Batas waktu permintaan habis |
| 429 | Terlalu banyak permintaan (kemungkinan besar Anda telah dibatasi) |
| 502 | Gateway buruk |
| 503 | Layanan tidak tersedia |
| 504 | Kesalahan waktu tunggu gateway |
Apakah Anda akan mencoba ulang Kode Status HTTP 403 - Dilarang? Tidak. Di sini, sistem berfungsi dengan baik, tetapi memberi tahu pemanggil bahwa mereka tidak berwenang untuk melakukan operasi yang diminta. Perhatian harus diberikan untuk mencoba kembali hanya operasi yang mengalami kegagalan.
Seperti yang direkomendasikan dalam Bab 1, pengembang Microsoft yang membangun aplikasi cloud-native harus menargetkan platform .NET. Versi 2.1 memperkenalkan pustaka HTTPClientFactory untuk membuat instans Klien HTTP untuk berinteraksi dengan sumber daya berbasis URL. Menggantikan kelas HTTPClient asli, kelas 'factory' mendukung banyak fitur yang ditingkatkan, salah satunya adalah integrasi erat dengan pustaka ketahanan Polly. Dengan itu, Anda dapat dengan mudah menentukan kebijakan ketahanan di kelas Startup aplikasi untuk menangani kegagalan parsial dan masalah konektivitas.
Selanjutnya, mari kita bahas lebih dalam pola coba ulang dan pemutus sirkuit.
Pola coba lagi
Dalam lingkungan cloud-native terdistribusi, panggilan ke layanan dan sumber daya cloud dapat gagal karena kegagalan sementara, yang biasanya akan pulih sendiri setelah jangka waktu singkat. Menerapkan strategi coba lagi membantu layanan cloud-native mengurangi skenario ini.
Pola Coba Lagi memungkinkan layanan untuk mencoba kembali operasi permintaan yang gagal beberapa kali (dapat dikonfigurasi) dengan waktu tunggu yang meningkat secara eksponensial. Gambar 6-2 menunjukkan upaya ulang sedang berlangsung.
Gambar 6-2. Coba lagi pola dalam tindakan
Dalam gambar sebelumnya, pola coba ulang telah diterapkan dalam operasi permintaan. Ini dikonfigurasi untuk memungkinkan hingga empat percobaan ulang sebelum mengalami kegagalan dengan interval jeda (waktu tunggu) dimulai dari dua detik, yang meningkat secara eksponensial untuk setiap upaya berikutnya.
- Pemanggilan pertama gagal dan mengembalikan kode status HTTP 500. Aplikasi menunggu selama dua detik dan mencoba kembali panggilan.
- Pemanggilan kedua juga gagal dan mengembalikan kode status HTTP 500. Aplikasi sekarang menggandakan interval backoff menjadi empat detik dan mencoba kembali panggilan.
- Akhirnya, panggilan ketiga berhasil.
- Dalam skenario ini, operasi pengulangan akan mencoba hingga empat kali sambil menggandakan durasi jeda sebelum panggilan dinyatakan gagal.
- Jika percobaan ke-4 gagal, kebijakan cadangan akan dipanggil untuk menangani masalah dengan cara yang efektif.
Penting untuk meningkatkan periode penundaan sebelum mencoba kembali panggilan, mengizinkan layanan untuk mengoreksi diri. Ini adalah praktik terbaik untuk menggunakan backoff yang meningkat secara eksponensial (menggandakan periode pada setiap percobaan kembali) agar memberikan waktu yang cukup untuk koreksi.
Pola pemutus sirkuit
Meskipun pola coba lagi dapat membantu menyelamatkan permintaan yang terjerat dalam kegagalan parsial, ada situasi di mana kegagalan dapat disebabkan oleh peristiwa yang tidak tertandingi yang akan membutuhkan waktu lebih lama untuk diselesaikan. Keparahan kesalahan ini dapat berkisar mulai dari hilangnya sebagian konektivitas hingga kegagalan total layanan. Dalam situasi ini, tidak ada gunanya aplikasi untuk terus mencoba kembali operasi yang tidak mungkin berhasil.
Untuk memperburuk keadaan, menjalankan operasi coba lagi berkelanjutan pada layanan non-responsif dapat mengarahkan Anda ke skenario penolakan layanan yang disebabkan oleh diri sendiri, di mana layanan Anda dibanjiri dengan panggilan yang terus-menerus, yang menguras sumber daya seperti memori, utas, dan koneksi basis data, mengakibatkan kegagalan di bagian sistem yang tidak terkait yang menggunakan sumber daya yang sama.
Dalam situasi ini, akan lebih baik jika operasi berakhir seketika dan hanya berusaha memanggil layanan jika itu kemungkinan berhasil.
Pola Circuit Breaker dapat mencegah aplikasi berulang kali mencoba menjalankan operasi yang kemungkinan gagal. Setelah sejumlah upaya panggilan gagal yang telah ditentukan sebelumnya, sistem memblokir semua lalu lintas ke layanan. Secara berkala, ini akan memungkinkan panggilan uji coba untuk menentukan apakah kesalahan telah diselesaikan. Gambar 6-3 menunjukkan pola Circuit Breaker beraksi.
Gambar 6-3. Pola pemutus sirkuit sedang beraksi
Pada gambar sebelumnya, pola Circuit Breaker telah ditambahkan ke pola coba lagi asli. Perhatikan bagaimana setelah 100 permintaan gagal, pemutus sirkuit terbuka dan tidak lagi mengizinkan panggilan ke layanan. Nilai CheckCircuit, disetel pada 30 detik, menentukan seberapa sering pustaka mengizinkan satu permintaan diteruskan ke layanan. Jika panggilan tersebut berhasil, sirkuit ditutup dan layanan sekali lagi tersedia untuk lalu lintas.
Perlu diingat bahwa niat pola Circuit Breaker berbeda dari pola Coba Lagi. Pola Coba Lagi memungkinkan aplikasi untuk mencoba kembali operasi dengan harapan bahwa itu akan berhasil. Pola Circuit Breaker mencegah aplikasi melakukan operasi yang kemungkinan gagal. Biasanya, aplikasi akan menggabungkan kedua pola ini dengan menggunakan pola Coba lagi untuk memanggil operasi melalui pemutus sirkuit.
Pengujian untuk ketahanan
Pengujian untuk ketahanan tidak selalu dapat dilakukan dengan cara yang sama seperti Anda menguji fungsionalitas aplikasi (dengan menjalankan pengujian unit, pengujian integrasi, dan sebagainya). Sebagai gantinya, Anda harus menguji bagaimana performa beban kerja end-to-end dalam kondisi kegagalan, yang hanya terjadi secara insidentil. Misalnya: menyuntikkan kegagalan dengan menghentikan proses, menggunakan sertifikat yang kedaluwarsa, membuat layanan dependen tidak tersedia, dan lain-lain. Kerangka kerja seperti chaos-monkey dapat digunakan untuk pengujian chaos tersebut.
Ketahanan aplikasi adalah suatu keharusan untuk menangani operasi yang diminta bermasalah. Tapi, itu hanya setengah dari cerita. Selanjutnya, kami membahas fitur ketahanan yang tersedia di cloud Azure.