โ† Semua pembelajaran / Go Nol โ†’ Enterprise
Fase 9 ยท Performa & Observability

Skala: dari satu container ke banyak

Menambah container hanya membantu kalau aplikasimu benar-benar stateless dan kemacetannya memang di CPU aplikasi. Kalau tidak, kamu cuma memindahkan beban ke database dan membuat semuanya lebih buruk.

Sumber asli pkg.go.dev Resmi Rangkuman ~7 menit baca

Intisari

  • Stateless adalah syarat, bukan bonus. Sesi, cache, dan berkas unggahan harus di luar container.
  • Skala horizontal melipatgandakan koneksi database โ€” hitung ulang MaxOpenConns untuk jumlah task maksimum (Fase 4).
  • Kemacetan di database tidak diselesaikan dengan menambah task; ia diperburuk.
  • Ukur p95/p99, bukan rata-rata, dan skalakan berdasarkan metrik yang mewakili beban sungguhan.
  • Urutan yang benar: perbaiki kueri โ†’ CDN โ†’ cache โ†’ baru tambah task.

Daftar periksa stateless

KeadaanKalau di dalam containerHarus di
SesiPengguna ter-logout acakRedis (Fase 6)
CacheHit rate turun, jawaban tidak konsistenRedis (kecuali sengaja berlapis)
Berkas unggahanHilang saat task bergantiS3
Rate limitBatas efektif ร— jumlah taskRedis
Job terjadwalBerjalan N kaliSatu service khusus, atau lock terdistribusi
Antrean di memoriPekerjaan hilang saat deploySQS / Postgres (Fase 5)
Log ke berkasHilang saat task berhentistdout โ†’ CloudWatch
Penghitung di memoriAngka berbeda per taskMetrik teragregasi

Uji kelayakan sebelum menyalakan autoscaling: jalankan dua instans aplikasimu di laptop di port berbeda, taruh di belakang proksi sederhana, dan pakai selama satu jam. Setiap perilaku aneh yang muncul โ€” logout mendadak, hitungan yang tidak konsisten, unggahan yang hilang โ€” adalah keadaan yang masih tertinggal di dalam proses.

Vertikal versus horizontal

GejalaYang membantu
CPU aplikasi mentok, database santaiTambah task
Memori mentokTask lebih besar, atau kurangi alokasi
Database CPU mentokPerbaiki kueri, tambah index, read replica โ€” bukan tambah task
Menunggu I/O dari API luarConcurrency + timeout; task tidak membantu
Pool database antreKueri lebih cepat, atau pool lebih besar โ€” hati-hati batas RDS
Satu endpoint lambatPerbaiki endpoint itu

Menambah task saat database yang jadi kemacetan memperburuk keadaan. Sepuluh task berarti sepuluh kali koneksi dan sepuluh kali kueri masuk ke database yang sudah kewalahan โ€” dan p95-nya makin buruk, bukan membaik. Selalu periksa dulu di mana kemacetannya sebenarnya.

Aritmetika yang harus dihitung ulang

Setiap task menambah:

  MaxOpenConns koneksi ke database        โ†’ batasi (Fase 4)
  MaxIdleConnsPerHost koneksi ke tiap API โ†’ hormati rate limit mereka
  1 set koneksi Redis
  1 goroutine cron kalau kamu menjalankannya di service web โ† BAHAYA

Contoh: naik dari 4 ke 20 task
  koneksi DB   :  4ร—20 = 80   โ†’  20ร—20 = 400   โ† melebihi batas RDS
  panggilan API: kuota 1000/menit dibagi 20, bukan 4
  job cron     : berjalan 20 kali per jadwal โ† duplikasi email, invoice

Jalankan penjadwal di service ECS-nya sendiri dengan desiredCount: 1, atau pakai EventBridge Scheduler yang memanggil satu run-task. Menjalankan cron di dalam service web adalah bug yang tidak terlihat sampai hari pertama autoscaling menaikkan jumlah task.

Autoscaling berdasarkan metrik yang benar

Metrik pemicuCocok kalau
CPU rata-rata (target ~60%)Beban memang CPU-bound โ€” titik awal yang wajar
Permintaan per target (ALB)Lebih baik untuk beban I/O-bound
p95 latensiBagus, tapi bereaksi terlambat
Kedalaman antrean SQSYang benar untuk worker
MemoriHampir tidak pernah โ€” memori tinggi biasanya kebocoran, bukan beban
Setelan yang menghindari osilasi:

  scale out : cepat  (1 menit cooldown)   โ€” telat menambah berarti pengguna menunggu
  scale in  : lambat (5โ€“10 menit cooldown) โ€” terlalu cepat mengurangi = naik-turun terus
  minimum   : โ‰ฅ 2 task, di AZ berbeda      โ€” satu task berarti tidak ada redundansi
  maksimum  : dibatasi kapasitas DATABASE, bukan oleh anggaran saja

Menguji beban dengan benar

# Ramai sederhana
hey -z 60s -c 50 https://staging.contoh.id/produk

# Skenario berurutan mendekati perilaku nyata
k6 run skenario.js
Kesalahan uji bebanAkibatnya
Menguji satu URL sajaSemuanya kena cache; hasilnya tidak berarti
Menguji dengan 10 baris dataSemua kueri cepat; index tidak teruji
Menguji dari laptopJaringanmu yang jadi batas, bukan aplikasinya
Melihat rata-rataMenyembunyikan pengguna yang menunggu lama
Tanpa tahap pemanasanPool dan cache masih dingin
Menguji di lingkungan yang lebih kecilHasilnya tidak bisa diekstrapolasi

Yang dicari dari uji beban bukan angka maksimum, melainkan titik belok: beban di mana p95 mulai naik lebih cepat daripada trafik. Di bawah titik itu sistemmu sehat; di atasnya ia sedang mengantre. Angka itulah yang jadi dasar menyetel batas autoscaling.

Urutan yang benar

  1. Ukur. pprof, trace, dan pg_stat_statements โ€” jangan menebak.
  2. Perbaiki kueri. Index dan N+1 hampir selalu pengungkit terbesar (Fase 4).
  3. Pindahkan ke CDN. Untuk halaman publik, ini mengalahkan semuanya.
  4. Cache. Redis untuk yang mahal dan sering dibaca.
  5. Pindahkan pekerjaan ke antrean. Keluarkan dari siklus permintaan.
  6. Baru tambah task โ€” setelah stateless dan setelah aritmetika koneksi dihitung.
  7. Baru pikirkan arsitektur. Enam langkah di atas menyelesaikan sebagian besar kasus.

Latihan: jalankan dua instans aplikasimu di belakang satu proksi, lalu login dan klik-klik selama beberapa menit. Catat setiap perilaku aneh โ€” itu daftar keadaan yang masih tersimpan di dalam proses. Lalu jalankan hey -z 60s -c 50 dengan kenaikan konkurensi bertahap dan temukan titik belok p95-mu.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.