System Design Fundamentals¶
A framework for any design question¶
- Clarify requirements — functional + non-functional (scale, latency, consistency, availability).
- Estimate scale — QPS, data size, read/write ratio.
- API design — endpoints, request/response, pagination.
- High-level components — client → gateway/LB → services → data stores / caches.
- Data model & storage — SQL vs NoSQL, indexing, partitioning.
- Scale it — horizontal scaling, load balancing, caching, async/queues, CDN.
- Resilience — timeouts, retries, circuit breakers, graceful degradation → Scalability & Resilience.
- Trade-offs — state them explicitly.
Building blocks¶
- Load balancer — L4 (transport) vs L7 (application); round-robin, least-connections.
- Caching — cut latency + load → Caching.
- Database — replication (read scaling), sharding/partitioning (write scaling), indexing.
- Message queue — decouple + smooth spikes → Messaging.
- CDN — static assets near users.
- API gateway — routing, auth, rate limiting, aggregation.
Key theory¶
- CAP — during a partition, choose Consistency or Availability → see DB Principles.
- Consistency models — strong vs eventual.
- Statelessness — externalize session → any instance serves any request → horizontal scale.
- Idempotency — safe retries (idempotency keys for writes).
- Pagination — offset vs cursor/keyset (cursor scales for deep pages).
Scaling axes¶
Vertical (bigger box) vs horizontal (more boxes). Prefer horizontal + stateless behind a load balancer.