Pola Resiliensi
Masuk untuk menyimpan progres Anda di semua perangkat. Sampai saat itu, progres disimpan di browser ini.
Mengapa ini penting
Setiap panggilan eksternal (database, payment gateway, penyedia LLM, SMS) suatu saat akan lambat, gagal, atau gagal di tengah jalan. Kode buatan AI hampir selalu mengasumsikan happy path. Satu dependensi lambat tanpa timeout bisa menjatuhkan seluruh aplikasi Anda karena menghabiskan thread, koneksi, atau konkurensi serverless.
Capaian pembelajaran
- Memasang timeout di setiap panggilan keluar dan menentukannya dari latency budget.
- Melakukan retry dengan aman: hanya untuk operasi idempotent, dengan exponential backoff dan jitter, serta batas maksimal.
- Menggunakan circuit breaker dan fallback untuk graceful degradation.
- Menerapkan backpressure dan dead letter queue agar beban berlebih dan poison message tidak berantai.
- Menyediakan health check yang bermakna.
Materi
7.1 Timeout (11)
- Timeout default di banyak HTTP client tidak terbatas atau sampai beberapa menit. Atur secara eksplisit: connect timeout + request timeout.
- Turunkan dari anggaran: jika halaman harus merespons dalam 2 s dan memanggil tiga service secara berurutan, masing-masing mendapat jauh di bawah 2 s.
- Teruskan deadline: jika pemanggil hanya punya sisa 300 ms, jangan memulai panggilan 2 s.
- Panggilan LLM: gunakan streaming dengan timeout token pertama dan timeout total.
7.2 Retry dan exponential backoff (12, 13)
- Retry hanya untuk error sementara (timeout, 429, 502, 503, 504, connection reset). Jangan pernah retry 400/401/403/422.
- Retry hanya operasi yang idempotent, atau yang membawa idempotency key (04 · API dan Kontrak).
- Backoff:
delay = min(cap, base * 2^attempt)ditambah jitter acak agar ribuan klien tidak melakukan retry secara serempak (thundering herd). - Batasi jumlah percobaan (biasanya 3) dan total waktunya. Patuhi
Retry-After. - Retry hanya di satu lapisan. Retry di setiap lapisan akan berlipat: 3 x 3 x 3 = 27 panggilan per satu aksi pengguna.
7.3 Circuit breaker (10)
State: closed (normal) → open setelah ambang kegagalan (fail fast, tanpa panggilan) → half-open setelah masa jeda (loloskan beberapa untuk menguji) → closed jika sehat. Pasangkan dengan fallback: data cache, fitur yang diturunkan kemampuannya, pesan "kami akan memberi tahu Anda" yang masuk antrean, atau penyedia sekunder (misalnya vendor LLM kedua).
7.4 Bulkhead dan backpressure (44)
- Bulkhead: pool/batas terpisah per dependensi agar LLM yang lambat tidak menghabiskan kapasitas yang dibutuhkan endpoint login Anda.
- Backpressure: ketika consumer tidak sanggup mengikuti, dorong balik (queue berbatas, 429/503 dengan
Retry-After, load shedding untuk pekerjaan berprioritas rendah) alih-alih terus menampung sampai memori habis.
7.5 Dead letter queue (20)
Setelah N kali gagal diproses, pindahkan pesan ke DLQ alih-alih retry selamanya ("poison message" bisa memblokir queue). Pasang alert pada kedalaman DLQ. Bangun tool untuk memeriksa, memperbaiki, dan memutar ulang (replay).
7.6 Health check (56, 57)
- Liveness: "apakah prosesnya hidup?" Murah; tidak pernah mengecek dependensi (kalau tidak, gangguan sesaat di DB akan me-restart semua pod).
- Readiness: "bisakah saya melayani traffic sekarang?" Mengecek dependensi kritis; mengeluarkan instance dari load balancer saat bernilai false.
- Startup: untuk service yang lambat booting.
- Status page publik yang diisi oleh synthetic check atas perjalanan pengguna yang nyata.
7.7 Graceful degradation
Putuskan per fitur: apa yang dilihat pengguna ketika dependensi ini mati? Tuliskan. Contoh: rekomendasi disembunyikan, pembayaran masuk antrean dengan pesan yang jelas, asisten AI menampilkan "sementara tidak tersedia" alih-alih spinner yang berputar selamanya.
Lab 7: Chaos di laptop Anda
Gunakan Toxiproxy (atau middleware fault injection) di antara aplikasi Anda dan dependensinya.
- Tambahkan latensi 5 s ke penyedia LLM. Amati. Tambahkan timeout, retry dengan jitter, circuit breaker, fallback. Amati lagi.
- Buat penyedia pembayaran mengembalikan 503 untuk 50% panggilan. Buktikan tidak ada tagihan ganda.
- Suntikkan poison message ke queue Anda; buktikan pesan itu masuk ke DLQ dan memicu alert.
- Matikan database selama 30 s. Readiness gagal, liveness tetap hidup, service pulih tanpa restart.
Definition of Done
Paket prompt AI
- "Temukan setiap panggilan jaringan keluar di repo ini. Laporkan mana yang tidak punya timeout, mana yang melakukan retry pada operasi non-idempotent, dan mana yang tidak punya fallback."
- "Buat HTTP client bersama dengan timeout, retry hanya pada error sementara dengan exponential backoff dan full jitter, serta circuit breaker per host."