Recraftory

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