Scalability
Memahami konsep skalabilitas sistem dan strategi untuk menghadapi pertumbuhan traffic
Apa itu Scalability
- Kemampuan sistem untuk menangani peningkatan beban (traffic, data, pengguna) tanpa degradasi performa yang signifikan
- Sistem yang scalable bisa berkembang seiring pertumbuhan bisnis
- Skalabilitas bukan hanya tentang traffic tinggi — tapi juga tentang kemudahan scaling itu sendiri
Jenis Scaling
Vertical Scaling (Scale Up)
- Menambah kapasitas pada satu mesin: CPU lebih banyak, RAM lebih besar
- Lebih mudah dilakukan — tidak perlu mengubah arsitektur
- Ada batas maksimal hardware yang bisa di-upgrade
- Downtime saat upgrade (tergantung provider)
- Cocok untuk database yang sulit di-distribute (misalnya relational database tradisional)
Horizontal Scaling (Scale Out)
- Menambah lebih banyak mesin ke pool
- Tidak ada batas teoritis — bisa terus ditambah
- Membutuhkan arsitektur yang mendukung: stateless, load balancer
- Lebih kompleks tapi lebih flexible
- Cocok untuk application server dan stateless service
Stateless vs Stateful
Stateless Service
- Tidak menyimpan state di server — setiap request independen
- Bisa di-scale horizontal dengan mudah
- State disimpan di database atau cache eksternal
- Contoh: REST API yang menyimpan session di Redis
Stateful Service
- Menyimpan state di server (misal: in-memory session)
- Sulit di-scale horizontal karena request perlu ke server yang sama
- Untuk scale, perlu sticky sessions atau migrasi state
Strategi Skalabilitas
Load Balancing
- Distribusikan traffic ke beberapa instance
- Round robin, least connections, atau berdasarkan load
- Menghilangkan single point of failure
Caching
- Kurangi beban database dengan cache hasil query atau komputasi
- Cache aside: aplikasi check cache dulu, jika miss baru ke database
- Write-through: tulis ke cache dan database bersamaan
- Perhatikan cache invalidation — ini salah satu masalah tersulit dalam CS
Database Scaling
Read Replicas
- Tambahkan replica yang hanya untuk read
- Primary handle write, replica handle read
- Cocok jika sistem banyak read (social media, e-commerce listing)
Sharding
- Membagi data ke beberapa database berdasarkan shard key
- Contoh: user dengan ID 1-1000 di DB1, 1001-2000 di DB2
- Meningkatkan write throughput secara signifikan
- Kompleks untuk di-manage dan query lintas shard
Database Partitioning
- Membagi tabel besar menjadi partition yang lebih kecil
- Contoh: data transaksi per bulan di partition terpisah
- Query lebih cepat karena scan data yang lebih sedikit
Asynchronous Processing
- Pekerjaan berat tidak perlu sinkron dengan request user
- Gunakan message queue untuk background jobs
- Contoh: kirim email, generate laporan, proses gambar
CDN (Content Delivery Network)
- Distribusikan static assets ke edge server yang lebih dekat ke user
- Mengurangi latency untuk pengguna yang jauh dari server utama
- Mengurangi bandwidth yang perlu di-serve dari origin server
Bottleneck yang Umum
- Database: paling sering menjadi bottleneck, terutama saat query tidak di-optimize
- N+1 queries: loop yang membuat query database per item → gunakan eager loading
- Synchronous external calls: API eksternal yang lambat memblok request
- Large payload: response yang besar membutuhkan bandwidth dan parsing time lebih
Mengukur Skalabilitas
- Throughput: berapa request per detik yang bisa ditangani?
- Latency at percentile: P50, P95, P99 latency di berbagai level load
- Error rate: apakah error meningkat saat load naik?
- Load testing: simulasikan traffic tinggi sebelum event besar
Praktik Terbaik
- Ukur sebelum optimize — jangan asumsi di mana bottleneck berada
- Horizontal scaling lebih fleksibel untuk sistem modern
- Design stateless service dari awal lebih mudah daripada migrasi kemudian
- Cache dengan bijak — cache yang salah bisa menyebabkan data stale
- Monitor metrik skalabilitas secara aktif, jangan tunggu sampai down