SavefileArchive
USD/IDR ...
|
BTC ...
|
ETH ...
|
GOLD/gram ...
Terbaru
SavefileArchive — Tutorial coding, tips programming, dan dunia musik untuk developer & pecinta musik Indonesia
Mengenal Circuit Breaker Pattern: "Saklar Pemutus" yang Menyelamatkan Server dari Kehancuran

Mengenal Circuit Breaker Pattern: "Saklar Pemutus" yang Menyelamatkan Server dari Kehancuran

Mengenal Circuit Breaker Pattern: "Saklar Pemutus" yang Menyelamatkan Server dari Kehancuran

Ilustrasi Circuit Breaker Pattern dalam Server

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:

  1. User A klik "Bayar". Sistem Anda menunggu respon dari Payment Gateway (misal: antre selama 30 detik sebelum *Time Out*).
  2. Dalam hitungan detik, ratusan User lain juga mengklik "Bayar".
  3. Semua antrean/koneksi (*thread*) di server Anda tersangkut menunggu respon dari server Payment.
  4. 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/breaker atau gobreaker (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.