Mengenal Circuit Breaker Pattern: "Saklar Pemutus" yang Menyelamatkan Server dari Kehancuran
Mengenal Circuit Breaker Pattern: "Saklar Pemutus" yang Menyelamatkan Server dari Kehancuran
Dalam dunia kelistrikan rumah, kita mengenal sebuah alat bernama MCB (*Miniature Circuit Breaker*). Jika terjadi korsleting listrik, MCB akan otomatis "njeglek" (terputus/turun) untuk memutus aliran listrik agar rumah tidak kebakaran. Tahukah Anda, di dunia pemrograman (khususnya arsitektur *Microservices*), ada konsep serupa yang dinamakan Circuit Breaker Pattern?
Mari kita bahas secara mendalam apa itu *Circuit Breaker*, mengapa aplikasi besar sangat membutuhkannya, dan bagaimana cara kerjanya.
Anatomi Masalah: Efek Domino (Cascading Failures)
Bayangkan Anda membangun aplikasi *E-Commerce*. Saat pelanggan melakukan *Checkout*, sistem Anda harus memanggil API Payment Gateway eksternal (misal: Midtrans atau Stripe). Apa yang terjadi jika server Payment Gateway tersebut sedang *down* atau sangat lambat merespons?
Jika aplikasi Anda tidak memiliki perlindungan, inilah yang terjadi:
- User A klik "Bayar". Sistem Anda menunggu respon dari Payment Gateway (misal: antre selama 30 detik sebelum *Time Out*).
- Dalam hitungan detik, ratusan User lain juga mengklik "Bayar".
- Semua antrean/koneksi (*thread*) di server Anda tersangkut menunggu respon dari server Payment.
- RAM dan CPU server Anda penuh (*Resource Exhaustion*). Akhirnya, seluruh aplikasi Anda ikut mati (crash), padahal yang bermasalah hanyalah server Payment-nya saja.
Kematian sistem yang merambat inilah yang disebut Cascading Failures. Di sinilah *Circuit Breaker* masuk sebagai pahlawan penyelamat.
Apa itu Circuit Breaker Pattern?
Circuit Breaker Pattern adalah pola desain (*Design Pattern*) yang bertugas membungkus (*wrap*) sebuah fungsi panggilan API atau *service*. Jika panggilan tersebut terus-menerus gagal atau *timeout* melampaui batas wajar, maka "Saklar" akan diputus secara otomatis.
Ketika saklar terputus, sistem tidak akan mencoba menghubungi API tersebut lagi untuk sementara waktu. Alih-alih menunggu *timeout* 30 detik yang menyiksa server, sistem akan langsung mengembalikan respon *Error* dalam 0.1 detik kepada *user*, atau mengembalikan respon *Fallback* (cadangan).
3 Status (State) pada Circuit Breaker
Sama seperti saklar listrik, *Circuit Breaker* memiliki tiga status utama:
1. CLOSED (Normal / Tertutup)
Arus listrik mengalir. Semua *request* dari aplikasi Anda ke server tujuan (Payment Gateway) diizinkan lewat. Jika *request* sukses, tidak ada masalah. Jika ada yang gagal/error, *Breaker* akan mulai menghitung jumlah kegagalan tersebut.
2. OPEN (Terputus / Terbuka)
Jika jumlah kegagalan (misalnya 5x berturut-turut dalam 10 detik) melebihi ambang batas (*threshold*), saklar berubah menjadi OPEN. Aliran diputus. Jika ada *request* baru yang masuk, *Breaker* akan langsung me-reject *request* tersebut tanpa mencoba menghubungi server Payment sama sekali (langsung melempar *Exception*).
Mengapa? Agar server Payment bisa "bernapas" dan memperbaiki dirinya sendiri, dan server kita tidak kehabisan memori akibat mengantre.
3. HALF-OPEN (Setengah Terbuka)
Setelah saklar berada di status OPEN selama durasi tertentu (misal: 1 menit), *Breaker* akan berubah menjadi HALF-OPEN. Di fase ini, *Breaker* hanya mengizinkan satu atau sedikit request lewat sebagai "kelinci percobaan".
Jika *request* percobaan ini berhasil, berarti server Payment sudah sembuh! Saklar kembali menjadi CLOSED.
Jika percobaan ini tetap gagal, berarti server belum sembuh. Saklar kembali di-OPEN selama 1 menit ke depan.
Implementasi di Berbagai Bahasa Pemrograman
Anda tidak perlu membuat perhitungan statik status saklar ini dari nol. Ekosistem *open-source* sudah menyediakan *library* tangguh untuk hampir semua bahasa:
- Java / Spring Boot: Menggunakan
Resilience4j(pengganti Netflix Hystrix yang sudah *deprecated*). Sangat tangguh dan menjadi standar industri. - .NET / C#: Menggunakan
Polly. Salah satu *library* ketahanan (resilience) terbaik di ekosistem Microsoft. - Go (Golang): Menggunakan
go-resilience/breakerataugobreaker(Sony). Golang sangat bergantung pada ini karena arsitektur *microservices*-nya yang masif. - PHP / Laravel: Meskipun PHP secara natural adalah proses yang mati hidup per *request*, Anda tetap bisa mengimplementasikannya. Anda dapat menggunakan paket seperti
Guzzle Retry/Breaker Middleware, atau memanfaatkan fitur bawaan Laravel seperti RateLimiter dan penguncian Cache (Redis) untuk mensimulasikan *state* OPEN lintas *request*.
Kesimpulan
Membangun sistem yang tangguh tidak hanya tentang mempercepat *query database* atau menambah jumlah server (skalabilitas). Senior *Backend Engineer* yang hebat harus memikirkan Desain Bertahan (Defensive Design).
Dengan mengimplementasikan Circuit Breaker Pattern, aplikasi Anda tidak akan ikut "terseret ke jurang" saat layanan API pihak ketiga atau salah satu *microservice* internal Anda sedang mengalami gangguan. Sistem akan gagal dengan anggun (*fail gracefully*), melindungi *resource* utama, dan otomatis pulih tanpa campur tangan manusia.