Fundamental System Design: Scale dari 1 ke 1 Juta User
Prinsip-prinsip dasar mendesain sistem web yang scalable
Tujuan Pembelajaran
- Mengerti komponen dasar arsitektur web scalable
- Bisa mengidentifikasi bottleneck dalam sistem
- Mengerti trade-off antara consistency, availability, dan partition tolerance
Analogi
Scale Evolution:
1 User -> Single Server (monolith)
100 Users -> Load Balancer + 2 App Servers
1,000 Users -> Database separate + Caching
10,000 Users -> CDN + Read Replicas
100,000 Users -> Microservices + Message Queue
1,000,000 Users -> Multi-region + Sharding
Scaling adalah proses evolusi — setiap level punya challenge dan solusi berbeda
Penjelasan Konsep
System design adalah kemampuan untuk merancang sistem software yang bisa menangani growth — dari ratusan user sampai jutaan user. Ini adalah skill yang sangat dicari di level senior engineer ke atas.
Single Server (1-100 users)
Semua komponen (web server, app logic, database) berjalan di satu mesin. Simple tapi tidak scalable.
Load Balancer (100-1,000 users)
Traffic didistribusikan ke beberapa app server. Horizontal scaling.
Session management jadi challenge — solusi: sticky session atau shared session store (Redis).
Database Separation (1,000-10,000 users)
Database dipisah dari app server. Masing-masing bisa di-scale independently. Read replicas untuk offload read queries.
Caching Layer (10,000-100,000 users)
Redis/Memcached untuk cache frequently accessed data. CDN untuk static assets.
Database query optimization.
Microservices (100,000-1,000,000 users)
Monolith dipecah ke services kecil.
Independent deploy, independent scale.
Tapi tambah complexity: service discovery, inter-service communication, distributed tracing.
CAP Theorem
Dalam distributed system,
Kamu hanya bisa pilih 2 dari 3 — Consistency (semua node lihat data sama), Availability (selalu respond), Partition Tolerance (tetap berfungsi meski network failure).
Inti yang Perlu Dipahami
Bagian ini berfokus pada mengerti komponen dasar arsitektur web scalable., bisa mengidentifikasi bottleneck dalam sistem., dan mengerti trade-off antara consistency, availability, dan partition tolerance. Jangan terburu-buru menghafal istilahnya. Lebih penting untuk memahami peran setiap konsep dan kapan konsep itu muncul dalam pekerjaan web development.
Saat membaca Fundamental System Design, gunakan tujuan belajar sebagai penanda arah. Kalau kamu sudah bisa menjelaskan tujuan itu dengan kata-katamu sendiri, berarti fondasinya mulai terbentuk.
Cara Membayangkannya
Scaling adalah proses evolusi — setiap level punya challenge dan solusi berbeda. Analogi ini dipakai supaya konsep teknis tidak terasa melayang. Hubungkan setiap istilah dengan perannya: siapa yang meminta, siapa yang memproses, data apa yang berpindah, dan hasil apa yang diharapkan.
Kalau analoginya sudah terasa masuk akal, barulah lihat istilah teknisnya. Cara ini membuat materi lebih mudah dipahami daripada langsung menghafal definisi.
Saat Melihat Contoh Kode
Contoh kode pada chapter ini memakai bahasa typescript. Bacalah contoh kode sebagai ilustrasi alur, bukan sebagai bagian yang harus langsung dihafal. Round-robin adalah algoritma load balancing paling simple — distribusi sequential ke setiap server. Health check penting untuk mendeteksi server yang down dan menghindari mengirim traffic ke server mati.
Perhatikan nama fungsi, urutan langkah, dan data yang berpindah. Biasanya tiga hal itu sudah cukup untuk memahami hubungan antara teori dan praktik.
Konteks dalam Perjalanan Belajar
Setiap konsep di platform ini dipilih karena dipakai di industri. Fokus pada pemahaman, bukan hafalan.
Kamu sudah di bagian lanjutan. Mulai pikirkan bagaimana konsep ini dipakai di dunia kerja — bukan hanya untuk belajar, tapi untuk membangun produk nyata.
Gunakan pertanyaan reflektif dan prompt AI di akhir chapter sebagai latihan aktif. Membaca saja tidak cukup — kamu perlu menjelaskan ulang dengan kata-katamu sendiri.
Contoh Kode
// Simple load balancer simulation dengan Hono
import { Hono } from 'hono';
const app = new Hono();
// Round-robin load balancer
const servers = ['http://server1:3000', 'http://server2:3000', 'http://server3:3000'];
let currentIndex = 0;
app.all('*', async (c) => {
const target = servers[currentIndex];
currentIndex = (currentIndex + 1) % servers.length;
// Forward request ke target server
const response = await fetch(target + c.req.path, {
method: c.req.method,
headers: c.req.header(),
body: c.req.raw.body,
});
return response;
});
// Health check
setInterval(async () => {
for (const server of servers) {
try {
await fetch(server + '/health', { signal: AbortSignal.timeout(5000) });
console.log(`✅ ${server} healthy`);
} catch {
console.log(`❌ ${server} unhealthy — removing from pool`);
// Remove unhealthy server and alert
}
}
}, 30000);Penjelasan Kode
Prompt AI
Desain arsitektur untuk aplikasi e-commerce yang mulai dari 1.000 user dan target 100.000 user dalam 6 bulan. Identifikasi bottleneck di setiap bagian growth.
Pertanyaan Reflektif
Tidak ada arsitektur yang sempurna — hanya arsitektur yang tepat untuk requirement dan constraint saat ini. Avoid premature optimization, tapi design for scale.