Lewati ke konten

Resilience

Setiap fitur di grup ini sudah terimplementasi dan terverifikasi, masing-masing dengan cakupan unit dan integration test di test suite repo.

Subsistem resilience melindungi gateway dan upstream dari kegagalan beruntun (cascading failure), ketidakstabilan jaringan, dan degradasi latensi.

Circuit breaker melindungi gateway dan upstream dari kegagalan beruntun: saat upstream terus menerus gagal, breaker membuka (OPEN) sehingga request berikutnya langsung ditolak cepat di level gateway tanpa membebani backend yang bermasalah. Setelah masa jeda (cooldown), breaker berpindah ke HALF_OPEN untuk menguji coba koneksi dengan trafik terbatas, lalu kembali ke CLOSED setelah pulih.

  • Status CLOSED (jalur cepat): Request dieksekusi normal; metrik dicatat dalam sliding-window counter.
  • Status OPEN: Terpicu jika tingkat kegagalan melampaui failureThreshold. Timer jeda resetTimeout dimulai. Request langsung gagal dengan CircuitOpenError dan dialihkan ke fallback.
  • Status HALF_OPEN: Masa jeda berakhir dan request canary diizinkan. Pengujian berhasil menutup kembali breaker; kegagalan membukanya kembali.

Retry Manager mengeksekusi request upstream dengan pengulangan otomatis: kegagalan sementara (502, 503, 504, 408, 429, ECONNREFUSED, timeout) diulang menggunakan exponential backoff dan jitter penuh.

  • Filter Idempotensi: Hanya metode HTTP idempoten (GET, PUT, DELETE, HEAD, OPTIONS) yang diulang. Request POST hanya dieksekusi sekali untuk mencegah duplikasi efek samping.
  • Jitter dan Anggaran Waktu: Jitter mencegah lonjakan thundering herd. Retry berhenti jika akumulasi durasi request melampaui anggaran timeout atau jika circuit breaker berstatus OPEN.

Health Checker memelihara status kesehatan upstream (healthy: boolean) untuk memandu keputusan load balancer dan circuit breaker.

  • Pemeriksaan Aktif: Secara berkala mengirim GET /health ke node backend dan memverifikasi kode status.
  • Pemeriksaan Pasif: Menilai hasil dan latensi request produksi nyata saat proxy forwarding berlangsung tanpa menghasilkan trafik jaringan tambahan.
  • Histeresis: Membutuhkan kegagalan berurutan (unhealthyThreshold) sebelum menandai node TIDAK SEHAT, dan keberhasilan berurutan (healthyThreshold) sebelum mengembalikannya ke status SEHAT.

Fallback Handler menyajikan respons degradasi yang anggun saat request upstream gagal karena timeout, eror, atau circuit breaker yang terbuka:

  1. Fallback Statis: Respons kustom eksplisit yang dikonfigurasi per rute atau upstream.
  2. Penyajian Basi (Stale Serving): Menyajikan kembali respons cache yang kedaluwarsa dalam rentang ttl + maxStaleAge disertai header Warning: 110 - "Response is Stale".
  3. Template Standar: Menghasilkan respons problem JSON berbasis standar RFC (502, 503, 504) dengan header x-fallback-response: true.

Timeout Manager menegakkan lima batas durasi operasi agar tidak ada proses yang menggantung tanpa batas:

  • connection (5 dtk): Batas waktu koneksi soket upstream.
  • request (30 dtk): Total batas waktu siklus hidup request masuk.
  • upstream (20 dtk): Batas latensi respons upstream.
  • plugin (1 dtk): Batas eksekusi plugin tunggal.
  • idle (60 dtk): Batas waktu diam koneksi dalam pool soket.

Fitur resilience dikonfigurasi per upstream atau secara global dalam gateway.config.json:

OpsiTipeNilai BawaanDampak
upstreams[].healthCheck.enabledbooleantrueMengaktifkan pemantauan kesehatan berkala untuk upstream ini.
upstreams[].healthCheck.intervalnumber10000Milidetik antar pemeriksaan kesehatan aktif.
upstreams[].healthCheck.timeoutnumber5000Batas waktu milidetik sebelum pemeriksaan dianggap gagal.
upstreams[].healthCheck.pathstring"/health"Endpoint HTTP untuk pemeriksaan kesehatan aktif.
upstreams[].healthCheck.expectedStatusnumber200Kode status HTTP yang diharapkan dari upstream sehat.
circuitBreaker.failureThresholdnumber50Persentase kegagalan untuk membuka circuit breaker (OPEN).
circuitBreaker.resetTimeoutnumber60000Masa jeda (ms) dalam status OPEN sebelum probe canary.
circuitBreaker.halfOpenSuccessThresholdnumber3Jumlah sukses canary yang dibutuhkan untuk kembali ke status CLOSED.
retry.maxAttemptsnumber3Jumlah percobaan maksimum untuk kegagalan sementara.
retry.initialDelaynumber200Delay awal backoff dalam milidetik.
retry.maxDelaynumber5000Batas maksimum delay exponential backoff.
retry.jitterbooleantrueMenerapkan variasi acak (jitter) pada interval jeda.
fallback.enableStaleFallbackbooleantrueMengizinkan penyajian cache kedaluwarsa saat backend down.
fallback.maxStaleAgenumber300000Usia basi maksimum (ms) untuk data cache fallback.

Komponen resilience bekerja sama secara erat dalam fase penerusan proxy:

  1. Routing dan Penyaringan: Router memilih rute. Health Checker menyediakan daftar node upstream sehat ke load balancer.
  2. Pemeriksaan Circuit: Sebelum meminjam soket dari HttpClientPool, Circuit Breaker memverifikasi status target. Breaker OPEN langsung mengalihkan request ke Fallback Handler.
  3. Eksekusi & Loop Retry: Retry Manager membungkus penerusan upstream. Jika panggilan gagal dengan status retryable atau network timeout, penundaan backoff diterapkan sebelum mencoba kembali.
  4. Pengiriman Fallback: Jika seluruh percobaan retry habis atau batas timeout tercapai, Fallback Handler menangkap eror dan mengembalikan template statis, cache basi, atau JSON terstruktur.
  5. Umpan Balik Pasif: Keberhasilan atau kegagalan request memperbarui penghitung health check pasif dan sliding window circuit breaker.

Tradeoff dan Mode Kegagalan (Tradeoffs and failure modes)

Section titled “Tradeoff dan Mode Kegagalan (Tradeoffs and failure modes)”
  • Pencegahan Kegagalan Beruntun vs Ketersediaan: Circuit breaker mengorbankan ketersediaan sesaat dari node yang bermasalah untuk melindungi gateway dan upstream lain dari kehabisan pool soket.
  • Amplifikasi Retry: Mengulang request ke backend yang kelebihan beban dapat memperburuk kondisi backend. Retry Manager memitigasinya dengan membatasi retry hanya untuk metode idempoten, memakai jitter, dan memeriksa status breaker sebelum mengulang.
  • Konsistensi Stale Serving: Penyajian cache basi meningkatkan uptime saat outage dengan kompromi eventual consistency. Klien menerima header peringatan Warning: 110.
  • Mitigasi Flapping: Ambang batas histeresis pada Health Checker mencegah node berpindah-pindah status sehat-sakit secara liar akibat fluktuasi jaringan sesaat.