handel kesalahan yang mungkin memerlukan waktu yang bervariasi untuk pulih, saat terhubung ke layanan atau sumber daya jarak jauh. Pola ini dapat meningkatkan stabilitas dan ketahanan aplikasi.
Konteks dan masalah
Dalam lingkungan terdistribusi, panggilan ke sumber daya dan layanan jarak jauh dapat gagal karena kesalahan sementara, seperti koneksi jaringan yang lambat, waktu habis, atau sumber daya yang diatasi atau sementara tidak tersedia. Kesalahan ini biasanya memperbaiki diri setelah waktu yang singkat, dan aplikasi cloud yang kuat harus siap untuk menanganinya dengan menggunakan strategi seperti pola Retry.
Namun, mungkin ada juga situasi di mana kesalahan disebabkan oleh peristiwa yang tidak terduga, dan itu mungkin memakan waktu lebih lama untuk diperbaiki. Keparahan kesalahan ini dapat berkisar mulai dari hilangnya sebagian konektivitas hingga kegagalan total layanan. Dalam situasi ini, mungkin tidak ada gunanya bagi aplikasi untuk terus mencoba kembali operasi yang tidak mungkin berhasil, dan sebaliknya aplikasi harus dengan cepat menerima bahwa operasi telah gagal dan menangani kegagalan ini.
Selain itu, jika layanan sangat sibuk, kegagalan di satu bagian sistem dapat menyebabkan kegagalan berjenjang. Misalnya, operasi yang memanggil layanan dapat dikonfigurasi untuk menerapkan waktu habis, dan membalas dengan pesan kegagalan jika layanan gagal merespons dalam periode ini. Namun, strategi ini dapat menyebabkan banyak permintaan bersamaan ke operasi yang sama diblokir sampai periode waktu habis berakhir. Permintaan yang diblokir ini mungkin menyimpan sumber daya sistem penting seperti memori, utas, koneksi database, dan sebagainya, yang dapat menyebabkan kegagalan berjenjang. Jadi, sumber daya ini bisa menjadi habis, menyebabkan kegagalan bagian lain yang mungkin tidak terkait dari sistem yang perlu menggunakan sumber daya yang sama. Dalam situasi ini, akan lebih baik operasi segera gagal, dan hanya berusaha untuk memanggil layanan jika ada kemungkinan akan berhasil. Mengatur waktu habis yang lebih singkat mungkin membantu mengatasi masalah ini, tetapi waktu habis seharusnya tidak terlalu singkat sehingga operasi gagal sebagian besar waktu, bahkan jika permintaan ke layanan pada akhirnya akan berhasil.
Solusi
Pola Circuit Breaker dapat mencegah aplikasi berulang kali mencoba menjalankan operasi yang kemungkinan gagal. Membiarkannya berlanjut tanpa menunggu kesalahan diperbaiki atau membuang-buang siklus CPU sementara itu menentukan bahwa kesalahan itu bertahan lama. Pola Circuit Breaker juga memungkinkan aplikasi untuk mendeteksi apakah kesalahan telah diselesaikan. Jika masalah tampaknya telah diperbaiki, aplikasi dapat mencoba untuk memanggil operasi.
Tujuan dari pola Circuit Breaker berbeda dari pola Retry. Pola Retry memungkinkan aplikasi untuk mencoba kembali operasi dengan harapan bahwa itu akan berhasil. Pola Circuit Breaker mencegah aplikasi melakukan operasi yang kemungkinan akan gagal. Sebuah aplikasi dapat menggabungkan kedua pola ini dengan menggunakan pola Retry untuk memanggil operasi melalui pemutus sirkuit. Namun, percobaan ulang logika harus peka terhadap pengecualian yang dikembalikan oleh pemutus sirkuit dan meninggalkan upaya coba ulang jika pemutus sirkuit menunjukkan bahwa kesalahan tidak bersifat sementara.
Pemutus sirkuit bertindak sebagai proxy untuk operasi yang mungkin gagal. Proksi harus memantau jumlah kegagalan terbaru yang telah terjadi, dan menggunakan informasi ini untuk memutuskan apakah akan memungkinkan operasi dilanjutkan, atau segera mengembalikan pengecualian.
Proxy dapat diimplementasikan sebagai mesin status dengan kondisi berikut yang meniru kegunaan pemutus sirkuit listrik:
Ditutup: Permintaan dari aplikasi dirutekan ke operasi. Proxy mempertahankan hitungan jumlah kegagalan baru-baru ini, dan jika panggilan ke operasi tidak berhasil, proxy meningkatkan jumlah ini. Jika jumlah kegagalan baru-baru ini melebihi ambang batas yang ditentukan dalam jangka waktu tertentu, proxy ditempatkan dalam kondisi Terbuka. Pada titik ini proksi memulai time-out timer, dan ketika timer ini kedaluwarsa, proksi ditempatkan ke dalam status Half-Open.
Tujuan time-out timer adalah untuk memberikan waktu sistem untuk memperbaiki masalah yang menyebabkan kegagalan sebelum memungkinkan aplikasi untuk mencoba melakukan operasi lagi.
Terbuka: Permintaan dari aplikasi segera gagal dan pengecualian dikembalikan ke aplikasi.
Setengah Terbuka: Sejumlah permintaan terbatas dari aplikasi diizinkan untuk melewati dan memanggil operasi. Jika permintaan ini berhasil, ini diasumsikan bahwa kesalahan yang sebelumnya menyebabkan kegagalan telah diperbaiki dan pemutus sirkuit beralih ke keadaan Tertutup (penghitung kegagalan diatur ulang). Jika ada permintaan yang gagal, pemutus arus mengasumsikan bahwa kesalahan masih ada sehingga kembali ke status Buka dan memulai ulang timer waktu habis untuk memberi sistem jangka waktu lebih lanjut untuk pulih dari kegagalan.
Status Setengah Terbuka berguna untuk mencegah layanan pemulihan tiba-tiba dibanjiri permintaan. Ketika layanan pulih, mungkin dapat mendukung volume permintaan yang terbatas sampai pemulihan selesai, tetapi sementara pemulihan sedang berlangsung, banjir pekerjaan dapat menyebabkan layanan keluar atau gagal lagi.
Dalam gambar, penghitung kegagalan yang digunakan oleh status Tertutup berbasis waktu. Ini secara otomatis diatur ulang pada interval periodik. Desain ini membantu mencegah pemutus sirkuit memasuki status Open jika mengalami kegagalan sesekali. Ambang kegagalan yang berjarak sebagai pemutus sirkuit ke dalam keadaan Terbuka hanya tercapai ketika sejumlah kegagalan tertentu terjadi selama interval tertentu. Penghitung yang digunakan oleh statusSetengah Terbuka mencatat jumlah upaya yang berhasil untuk memanggil operasi. Pemutus sirkuit kembali ke status Tertutup setelah sejumlah permohonan operasi berturut-turut telah berhasil. Jika ada permohonan yang gagal, pemutus sirkuit segera memasuki keadaan Terbuka dan penghitung keberhasilan akan diatur ulang saat berikutnya memasuki status Setengah Terbuka.
Bagaimana sistem pemulihan ditangani secara eksternal, mungkin dengan memulihkan atau memulai ulang komponen yang gagal atau memperbaiki koneksi jaringan.
Pola Pemutus Sirkuit memberikan stabilitas saat sistem pulih dari kegagalan dan meminimalkan dampak pada performa. Ini dapat membantu mempertahankan waktu respons sistem dengan menolak permintaan dengan cepat untuk operasi yang cenderung gagal, bukan menunggu batas waktu operasi, atau tidak pernah kembali. Jika pemutus sirkuit menimbulkan peristiwa setiap kali berubah status, informasi ini dapat digunakan untuk memantau kesehatan bagian dari sistem yang dilindungi oleh pemutus sirkuit, atau untuk mengingatkan administrator ketika pemutus sirkuit melakukan perjalanan ke statusTerbuka.
Pola ini dapat disesuaikan dan dapat diadaptasi sesuai dengan jenis kemungkinan kegagalan. Misalnya, Anda dapat menerapkan timer waktu habis yang meningkat ke pemutus sirkuit. Anda dapat menempatkan pemutus sirkuit dalam status Buka selama beberapa detik awalnya, dan kemudian jika kegagalan belum diselesaikan, tingkatkan waktu habis menjadi beberapa menit, dan sebagainya. Dalam beberapa kasus, daripada status Terbukakembali gagal dan menaikkan pengecualian, mungkin lebih berguna untuk mengembalikan nilai default yang berarti bagi aplikasi.
Catatan
Secara tradisional, pemutus arus mengandalkan ambang batas yang telah dikonfigurasi sebelumnya seperti jumlah kegagalan dan durasi waktu habis, yang mengakibatkan perilaku deterministik tetapi terkadang suboptimal. Namun, teknik adaptif menggunakan AI dan ML dapat secara dinamis menyesuaikan ambang batas berdasarkan pola lalu lintas real-time, anomali, dan tingkat kegagalan historis, membuat pemutus sirkuit lebih tangguh dan efisien.
Masalah dan pertimbangan
Anda harus mempertimbangkan poin berikut saat memutuskan cara menerapkan pola ini:
Penanganan pengecualian: Aplikasi yang memanggil operasi melalui pemutus arus harus disiapkan untuk menangani pengecualian yang dimunculkan jika operasi tidak tersedia. Cara pengecualian ditangani akan jadi spesifik aplikasi. Misalnya, aplikasi dapat menurunkan fungsinya sementara, meminta operasi alternatif untuk mencoba melakukan tugas yang sama atau mendapatkan data yang sama, atau melaporkan pengecualian kepada pengguna dan meminta mereka untuk mencoba lagi nanti.
Jenis pengecualian: Permintaan mungkin gagal karena banyak alasan, beberapa di antaranya mungkin menunjukkan jenis kegagalan yang lebih parah daripada yang lain. Misalnya, permintaan mungkin gagal karena layanan jarak jauh mengalami crash dan akan memakan waktu beberapa menit untuk pulih, atau karena waktu habis karena layanan kelebihan beban sementara. Pemutus sirkuit mungkin dapat memeriksa jenis pengecualian yang terjadi dan menyesuaikan strateginya tergantung pada sifat pengecualian ini. Misalnya, mungkin memerlukan sejumlah besar pengecualian waktu habis untuk melakukan perjalanan pemutus sirkuit ke status Terbuka dibandingkan dengan jumlah kegagalan karena layanan benar-benar tidak tersedia.
Pemantauan: Pemutus sirkuit harus memberikan pengamatan yang jelas ke dalam permintaan yang gagal dan berhasil, memungkinkan tim operasi untuk menilai kesehatan sistem. Gunakan pelacakan terdistribusi untuk visibilitas end-to-end di seluruh layanan.
Recoverability: Anda harus mengonfigurasi pemutus sirkuit agar sesuai dengan pola pemulihan operasi yang dilindunginya. Misalnya, jika pemutus sirkuit tetap dalam status Terbuka untuk waktu yang lama, itu bisa menimbulkan pengecualian bahkan jika alasan kegagalan telah diselesaikan. Demikian pula, pemutus sirkuit dapat berfluktuasi dan mengurangi waktu respons aplikasi jika beralih dari status Terbuka ke keadaan Setengah Terbuka terlalu cepat.
Operasi pengujian gagal: Dalam status Buka, daripada menggunakan timer untuk menentukan kapan harus beralih ke status Setengah Terbuka, pemutus sirkuit dapat secara berkala melakukan ping layanan jarak jauh atau sumber daya untuk menentukan apakah itu tersedia lagi. Ping ini dapat berupa upaya untuk memanggil operasi yang sebelumnya gagal, atau dapat menggunakan operasi khusus yang disediakan oleh layanan jarak jauh khusus untuk menguji kesehatan layanan, seperti yang dijelaskan oleh pola Pemantauan Titik Akhir Kesehatan.
Penimpaan manual: Dalam sistem di mana waktu pemulihan untuk operasi yang gagal sangat bervariasi, bermanfaat untuk menyediakan opsi reset manual yang memungkinkan administrator untuk menutup pemutus sirkuit (dan mengatur ulang penghitung kegagalan). Demikian pula, administrator dapat memaksa pemutus sirkuit ke status Terbuka (dan memulai ulang timer habis) jika operasi yang dilindungi oleh pemutus sirkuit untuk sementara waktu tidak tersedia.
Konkurensi: Pemutus arus yang sama dapat diakses oleh sejumlah besar instans bersamaan aplikasi. Implementasi tidak boleh memblokir permintaan yang bersamaan atau menambahkan overhead yang berlebihan untuk setiap panggilan ke operasi.
Diferensiasi sumber daya: Berhati-hatilah saat menggunakan pemutus sirkuit tunggal untuk satu jenis sumber daya jika mungkin ada beberapa penyedia independen yang mendasar. Misalnya, di penyimpanan data yang berisi beberapa pecahan, satu pecahan mungkin dapat diakses sepenuhnya sementara yang lain mengalami masalah sementara. Jika respons kesalahan dalam skenario ini digabungkan, aplikasi mungkin mencoba mengakses beberapa pecahan bahkan ketika kegagalan sangat mungkin, sementara akses ke pecahan lain mungkin diblokir meskipun kemungkinan akan berhasil.
Pemutusan sirkuit yang dipercepat: Terkadang respons kegagalan dapat berisi informasi yang cukup bagi pemutus sirkuit untuk segera melakukan perjalanan dan tetap tersandung untuk jumlah waktu minimum. Misalnya, respons kesalahan dari sumber daya bersama yang kelebihan beban dapat menunjukkan bahwa segera mencoba ulang tidak dianjurkan dan bahwa aplikasi harus mencoba lagi dalam beberapa menit.
penyebaran multi-wilayah: Pemutus sirkuit dapat dirancang untuk penyebaran tunggal atau multi-wilayah. Yang terakhir dapat diimplementasikan menggunakan penyeimbang beban global atau strategi pemecahan masalah sirkuit sadar wilayah kustom yang memastikan failover terkontrol, pengoptimalan latensi, dan kepatuhan terhadap peraturan.
Pemutus arus jala Layanan: Pemutus arus dapat diimplementasikan pada lapisan aplikasi atau sebagai fitur lintas-pemotongan dan abstrak. Misalnya, jala layanan sering mendukung pemutusan sirkuit sebagai sidecar atau sebagai kemampuan mandiri tanpa memodifikasi kode aplikasi.
Catatan
Layanan dapat mengembalikan HTTP 429 (Terlalu Banyak Permintaan) jika membatasi klien, atau HTTP 503 (Layanan Tidak Tersedia) jika layanan saat ini tidak tersedia. Tanggapan dapat mencakup informasi tambahan, seperti durasi penundaan yang diantisipasi.
Memutar ulang permintaan yang gagal: Dalam status Terbuka, daripada hanya gagal dengan cepat, pemutus sirkuit juga dapat merekam detail setiap permintaan ke jurnal dan mengatur agar permintaan ini diputar ulang ketika sumber daya atau layanan jarak jauh tersedia.
Waktu habis yang tidak sesuai pada layanan eksternal: Pemutus atur mungkin tidak dapat sepenuhnya melindungi aplikasi dari operasi yang gagal di layanan eksternal yang dikonfigurasi dengan periode waktu habis yang panjang. Jika waktu habis terlalu lama, utas yang menjalankan pemutus sirkuit mungkin diblokir untuk jangka waktu yang lama sebelum pemutus sirkuit menunjukkan bahwa operasi telah gagal. Pada saat ini, banyak instans aplikasi lain mungkin juga mencoba untuk memanggil layanan melalui pemutus sirkuit dan mengikat sejumlah besar utas sebelum semuanya gagal.
Kemampuan beradaptasi terhadap diversifikasi komputasi: Pemutus airkuit harus memperhitungkan lingkungan komputasi yang berbeda, dari beban kerja tanpa server hingga kontainer, di mana faktor-faktor seperti cold start dan skalabilitas memengaruhi penanganan kegagalan. Pendekatan adaptif dapat secara dinamis menyesuaikan strategi berdasarkan jenis komputasi, memastikan ketahanan di seluruh arsitektur heterogen.
Kapan menggunakan pola ini
Gunakan pola ini:
- Untuk mencegah kegagalan kaskading dengan menghentikan pemanggilan yang berlebihan oleh layanan jarak jauh atau permintaan akses ke sumber daya bersama jika operasi ini sangat mungkin gagal.
- Untuk meningkatkan ketahanan multi-wilayah dengan merutekan lalu lintas secara cerdas berdasarkan sinyal kegagalan real-time.
- Untuk melindungi dari dependensi yang lambat, membantu Anda mengikuti tujuan tingkat layanan (SCO), dan untuk menghindari penurunan performa karena layanan latensi tinggi.
- Untuk menangani masalah konektivitas terputus-terputus dan mengurangi kegagalan permintaan di lingkungan terdistribusi.
Pola ini tidak direkomendasikan:
- Untuk menangani akses ke sumber daya privat lokal dalam aplikasi, seperti struktur data dalam memori. Dalam lingkungan ini, menggunakan pemutus sirkuit akan menambah overhead ke sistem Anda.
- Sebagai pengganti untuk menangani pengecualian dalam logika bisnis aplikasi Anda.
- Ketika algoritma coba lagi yang terkenal cukup dan dependensi Anda dirancang untuk menangani mekanisme coba lagi. Menerapkan pemutus sirkuit dalam aplikasi Anda dalam hal ini, dapat menambahkan kompleksitas yang tidak perlu ke sistem Anda.
- Saat menunggu pemutus sirkuit untuk mengatur ulang mungkin menimbulkan penundaan yang tidak dapat diterima.
- Jika Anda memiliki arsitektur berbasis pesan atau berbasis peristiwa, karena sering merutekan pesan yang gagal ke Dead Letter Queue (DLQ) untuk pemrosesan manual atau ditangguhkan. Isolasi kegagalan bawaan dan mekanisme coba lagi yang biasanya diterapkan dalam desain ini sering kali cukup.
- Jika pemulihan kegagalan dikelola di tingkat infrastruktur atau platform, seperti dengan pemeriksaan kesehatan di penyeimbang beban global atau jala layanan, pemutus sirkuit mungkin tidak diperlukan.
Desain beban kerja
Arsitek harus mengevaluasi bagaimana pola Circuit Breaker dapat digunakan dalam desain beban kerja mereka untuk mengatasi tujuan dan prinsip yang tercakup dalam pilar Azure Well-Architected Framework. Contohnya:
Pilar | Bagaimana pola ini mendukung tujuan pilar |
---|---|
Keputusan desain keandalan membantu beban kerja Anda menjadi tahan terhadap kerusakan dan untuk memastikan bahwa keputusan tersebut pulih ke status berfungsi penuh setelah kegagalan terjadi. | Pola ini mencegah kelebihan beban dependensi yang salah. Anda juga dapat menggunakan pola ini untuk memicu degradasi anggun dalam beban kerja. Pemutus sirkuit sering digabungkan dengan pemulihan otomatis untuk menyediakan pelestarian diri dan penyembuhan diri. - Analisis mode kegagalan RE:03 - KESALAHAN SEMENTARA RE:07 - RE:07 Pelestarian Mandiri |
Efisiensi Performa membantu beban kerja Anda memenuhi tuntutan secara efisien melalui pengoptimalan dalam penskalaan, data, kode. | Pola ini menghindari pendekatan coba lagi yang dapat menyebabkan pemanfaatan sumber daya yang berlebihan selama pemulihan dependensi dan juga dapat membebani performa pada dependensi yang mencoba pemulihan. - Pe:07 Kode dan infrastruktur - Respons masalah langsung PE:11 |
Seperti halnya keputusan desain apa pun, pertimbangkan tradeoff terhadap tujuan pilar lain yang mungkin diperkenalkan dengan pola ini.
Sumber daya terkait
Beberapa pola berikut mungkin juga berguna saat menerapkan pola ini:
Pola aplikasi web yang andal menunjukkan kepada Anda cara menerapkan pola pemutus sirkuit ke aplikasi web yang berkonvergsi di cloud.
Pola percobaan ulang. Menjelaskan bagaimana aplikasi dapat menangani kegagalan sementara yang diantisipasi ketika mencoba terhubung ke layanan atau sumber daya jaringan dengan secara transparan mencoba kembali operasi yang sebelumnya gagal.
Pola Pemantauan Titik Akhir Kesehatan. Pemutus sirkuit mungkin dapat menguji kesehatan layanan dengan mengirimkan permintaan ke titik akhir yang diekspos oleh layanan. Layanan harus mengembalikan informasi yang menunjukkan statusnya.