Performance adalah janji yang harus diukur sejak desain, bukan harapan saat produksi. Episode ini membangun arsitektur performa tinggi: latency budget yang dihitung per lapisan, strategi caching dari CDN sampai in-memory, dan desain performance testing yang mencerminkan beban nyata

Di episode 8 kita menetapkan SLO latency dan di episode 10 menjadikannya kontrak. Episode ini menjawab pertanyaan teknis: bagaimana memastikan arsitektur memenuhi janji performa itu? Performance bukan "semoga cepat" — ia keputusan desain yang bisa dihitung: latency budget, strategi caching, dan pengujian yang realistis.
Prinsip inti: performa diukur dari sudut pandang user, bukan dari server. Latensi yang kalian lihat di server internal adalah satu bagian dari perjalanan penuh. Episode ini membangun tiga kemampuan arsitektur: menghitung latency budget, merancang caching berlapis, dan mendesain performance testing.
Dari klik user sampai jawaban kembali, request melewati banyak lapisan. Setiap lapisan memakan waktu:
Latency budget = total target (p99) dibagi per lapisan, dan harus menjumlah kembali ke target. Jika target p99 = 500ms:
User + DNS : 100ms
Load balancer : 50ms
Aplikasi (logic) : 100ms
Cache hit : 30ms (sebagian besar request)
Database hit : 120ms (saat cache miss)
Jaringan internal: 50ms (buffer/headroom)
────────────────────────────────────────
Total : 450ms (25% headroom untuk variabilitas)Alasan buffer penting: target p99 artinya 99% request harus di bawah target. Variabilitas alami (GC, spike, cold start) memakan ruang — tanpa headroom, p99 pasti meleset.
Latency budget menjadi input keputusan arsitektur: jika budget database 120ms dan query-nya 80ms, sisa 40ms untuk jaringan — tapi jika query tiba-tiba 200ms, arsitektur harus menambahkan cache atau mengubah desain data (episode 5). Budget yang eksplisit membuat keputusan ini objektif.
Caching adalah tool performa paling efektif, dan bekerja paling baik berlapis — setiap lapisan menyaring bagian request yang berbeda:
| Lapisan | Contoh | Menyimpan |
|---|---|---|
| Browser | Cache-Control, ETag | Aset statis per-user |
| CDN | CloudFront, Cloudflare | Konten global, edge |
| In-memory | Redis, Memcached | Data sering diakses |
| Database | Query cache, read replica | Hasil query berulang |
Warning
Kesalahan klasik: cache stampede. Saat cache expired bersamaan dan semua request menerjang database sekaligus, database kolaps — dan inilah penyebab banyak "server down" misterius. Desain cache dengan stale-while-revalidate atau locking agar hanya satu proses yang mengisi ulang.
Cache sangat memengaruhi persentil: p50 (median) turun drastis dengan cache, tapi p99 tetap tinggi jika request uncached lambat. Ukur p99 cache-hit vs cache-miss — jika miss jauh lebih lambat, user yang beruntung dapat cache cepat dan yang tidak dapat lambat; pengalaman tidak konsisten.
Performance testing bukan "kirim request sebanyak mungkin sampai patah". Desain yang benar meniru pola beban produksi:
| Jenis Test | Tujuan |
|---|---|
| Load test | Berapa banyak beban normal yang bisa ditopang? |
| Stress test | Di titik mana sistem patah? Bagaimana cara patahnya? |
| Soak test | Beban stabil jangka panjang: ada kebocoran (memory leak)? |
| Spike test | Lonjakan tiba-tiba: bagaimana sistem merespons? |
import http from 'k6/http'
export const options = {
stages: [
{ duration: '1m', target: 50 }, // ramping naik
{ duration: '3m', target: 50 }, // beban stabil
{ duration: '1m', target: 0 }, // turun
],
}
export default function () {
http.get('https://api.example.com/orders')
}Test di atas mengukur perilaku pada beban bertahap — jauh lebih realistis daripada serangan 10.000 request instan.
Jangan uji performa sekali sebelum rilis. Jadikan regression test: setiap perubahan kode berpotensi menurunkan performa. Bandingkan metrik dengan baseline — jika p99 naik melebihi ambang, pull request ditolak. Ini menyatukan performance dengan pipeline episode 11.
Kerangka desain:
Inti yang harus dibawa pulang:
Di episode 22 selanjutnya kita akan membahas scalability patterns — scaling horizontal/vertikal, desain stateless, dan scaling database. Sampai jumpa di episode 22!