Membuat sistem tumbuh melayani jutaan pengguna: perbedaan scaling vertikal dan horizontal, prinsip desain stateless yang menjadi syarat utama, cara kerja load balancer, dan strategi scaling database

Di episode 20 kalian melindungi ketersediaan dari serangan. Sekarang pertanyaan sebaliknya: bagaimana melayani pertumbuhan yang sah? Produk yang sukses suatu saat melampaui kapasitas satu server — dan backend yang tidak dirancang untuk tumbuh akan roboh justru di momen paling penting: saat traffic naik.
Mengapa scalability penting? Karena cara sistem tumbuh menentukan biaya dan keandalan. Sistem yang hanya bisa naik dengan membeli server yang semakin besar (vertical scaling) punya langit-langit — dan harga yang naik eksponensial. Sistem yang dirancang stateless dan horizontal bisa tumbuh dengan menambah instance murah. Episode ini membangun fondasi scalability dan load balancing.
Vertical scaling (scale-up): menambah daya satu server — CPU, memori. Sederhana, tapi ada batas fisik dan biaya melonjak.
Horizontal scaling (scale-out): menambah jumlah instance di belakang load balancer. Inilah cara sistem modern bertahan: 100 instance murah lebih tangguh dari 1 server raksasa — dan jika satu mati, yang lain tetap melayani.
Instance yang diskalakan horizontal tidak boleh menyimpan state yang bergantung pada instance tertentu. Jika user login di instance A lalu request berikutnya sampai ke instance B yang tidak tahu state-nya, sesi rusak.
Pola stateful yang menghalangi scaling:
| State di instance | Masalah |
|---|---|
| Sesi user di memori proses | Instance B tidak tahu sesi |
| Rate limit di memori (episode 20) | Counter tidak konsisten |
| Upload file ke disk lokal | File tidak ada di instance lain |
| WebSocket terikat instance | Koneksi putus saat scaling |
Perbaikan: pindahkan state ke sistem eksternal:
Note
Uji kemudahan scaling dengan satu pertanyaan: bisakah request berikutnya dari user yang sama dilayani instance yang berbeda tanpa masalah? Jika jawabannya tidak, ada state yang harus dipindah. Stateless application adalah perbedaan terbesar antara arsitektur yang bisa dan tidak bisa diskalakan.
Load balancer membagi traffic ke beberapa instance. Tiga aspek yang wajib dipahami:
Load balancer harus tahu instance mana yang sehat:
GET /health # direspons oleh aplikasi
# instance yang gagal health check dikeluarkan dari rotasi otomatisSticky session terlihat praktis (state di memori tetap jalan), tapi membatalkan manfaat horizontal scaling: satu instance bisa kebanjiran. Solusi yang benar adalah stateless + state eksternal, bukan sticky.
upstream api_servers {
least_conn;
server api-1.internal:3000;
server api-2.internal:3000;
server api-3.internal:3000;
}
server {
listen 80;
location / {
proxy_pass http://api_servers;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}Cloud provider menyediakan versi managed (ALB, Cloud Load Balancer) — pakai itu di produksi (episode 16).
Scaling tidak harus manual — auto scaling menambah/mengurangi instance berdasarkan metrik:
TargetTrackingScalingConfiguration:
TargetValue: 60.0 # target CPU 60%
PredefinedMetricSpecification:
PredefinedMetricType: EC2AutoScalingAverageCPUUtilization
# instance bertambah saat CPU > 60%, berkurang saat idlePrinsip penting:
Saat aplikasi diskalakan horizontal, database jadi titik berikutnya. Empat strategi dari yang paling sederhana:
Sebagian besar "database lambat" selesai di sini tanpa scaling apa pun.
Traffic baca (biasanya 80-90%) dialihkan ke replika:
Writes → primary
Reads → replica-1, replica-2, ...Redis mengurangi beban database secara drastis sebelum perlu scaling.
Data dipecah per key (misal user_id % 10) ke banyak database. Terakhir — menambah kompleksitas besar: join lintas shard mustahil, dan resharding menyakitkan.
Urutan ini penting: jangan sharding sebelum yang lain habis. Mayoritas sistem cukup di tahap optimasi + replica + cache.
Semua yang pernah kita bangun mulai saling terhubung di sini:
Tip
Arsitektur yang siap diskala bukan soal teknologi mahal — melainkan disiplin: stateless, state eksternal, metrik yang terukur, dan strategi database yang bertahap. Kalian sudah membangun semua fondasinya di episode 0-20; scaling hanyalah merangkainya.
Menambah RAM/CPU terus menerus = biaya naik, batas fisik tercapai. Pindah ke horizontal.
Mengandalkan sticky untuk menutupi stateful app menunda masalah — scaling jadi tidak fleksibel. Pindahkan state, bukan tempel instance.
Load balancer tanpa health check mengirim traffic ke instance mati. /health wajib.
Scaling tanpa tahu kapasitas = menebak. Load test untuk menemukan titik patah (episode 25).
Memecah database sebelum optimasi + cache habis = kompleksitas tanpa manfaat.
Episode 21 membuat sistem tumbuh: vertical vs horizontal scaling, prinsip stateless sebagai syarat utama, cara kerja load balancer, auto scaling berdasarkan metrik, dan strategi scaling database yang bertahap.
Inti yang harus dibawa pulang:
Di episode 22 selanjutnya kita akan masuk pola tingkat lanjut: event-driven & streaming — Kafka, event sourcing, dan CQRS untuk sistem yang reaktif. Sampai jumpa di episode 22!