All chapters in this track
- 01Chapter 1: Why System Design Is Its Own Skill
- 02Chapter 2: Core Building Blocks and Vocabulary
- 03Chapter 3: Eliciting Non-Functional Requirements
- 04Chapter 4: Back-of-Envelope Capacity Estimation
- 05Chapter 5: Caching Strategies and Cache Invalidation at the Systems Level
- 06Chapter 6: Load Balancing and Horizontal Scaling
- 07Chapter 7: Database Selection, Replication, and Sharding at a Systems Level
- 08Chapter 8: Asynchronous Processing, Message Queues, and Event-Driven Design
- 09Chapter 9: API Design from a Systems Perspective: REST, gRPC, GraphQL
- 10Chapter 10: The CAP Theorem and Consistency Models in Practical Terms
- 11Chapter 11: Microservices vs. Monoliths and Drawing Service Boundaries
- 12Chapter 12: Designing for Failure: Redundancy, Failover, Graceful Degradation
- 13Chapter 13: A Repeatable Framework for Any System Design Problem
- 14Chapter 14: Worked Example: URL Shortener
- 15Chapter 15: Worked Example: Chat System
- 16Chapter 16: Worked Example: News Feed
- 17Chapter 17: Worked Example: Rate Limiter
Chapter 2 of 17
Chapter 2: Core Building Blocks and Vocabulary
Why this matters
System design conversations move fast, and they rely on a shared vocabulary of building blocks that every participant is expected to recognize instantly — clients, load balancers, caches, CDNs, queues, databases, services. This chapter is a fast, precise survey of each, deliberately brief on mechanics already covered in depth in this book series' companion volumes, and focused instead on each block's role in a larger system.
The building blocks, and where each one's deep mechanics live
[BEGINNER]
- Client — whatever originates a request: a browser, a mobile app, another service. In system design diagrams, the client is usually drawn as the starting point of every request flow.
- Load balancer — distributes incoming requests across multiple backend servers, enabling horizontal scaling and fault tolerance (full mechanics: companion Networking book, Chapter 8).
- Cache — stores frequently-accessed data in fast-access storage to avoid repeatedly recomputing or re-fetching it from a slower source (full mechanics: this book's Chapter 5, and the companion Database book's Chapter 12).
- CDN (Content Delivery Network) — caches content geographically close to users, reducing physics-bound latency for static or slowly-changing content (full mechanics: companion Networking book, Chapter 8).
- Queue / message broker — decouples producers of work from consumers, enabling asynchronous processing and absorbing load spikes (full mechanics: this book's Chapter 8, and the companion Design Patterns book's Chapter 16 on Event-Driven Architecture).
- Database — the system of record for persistent data, relational or NoSQL (full mechanics: the entire companion Database book; this book's Chapter 7 covers the systems-level selection/scaling view specifically).
- Service — a distinct, independently-deployable unit of business logic, communicating with other services typically over a network (full mechanics: this book's Chapter 11 on microservices vs. monoliths).
Assembling the blocks into a request flow
[IN PRACTICE] A typical request through a reasonably-scaled web system touches several of these blocks in sequence — being able to draw and narrate this flow fluently is a foundational system design skill in its own right, since nearly every specific design question is really a variation on "where in this flow does the interesting complexity live":
Client
|
v
CDN (serves static assets directly; forwards dynamic requests onward)
|
v
Load Balancer (distributes across many backend server instances)
|
v
Service (application/business logic) ----> Cache (checked first for hot data)
| |
v v
Database (source of truth) <----(cache miss falls through to here)
|
v
[Response travels back up the same path to the client]
(Separately, off the main synchronous request path:)
Service ----> Queue ----> Background Worker (async processing: sending
an email, generating a
report, etc. -- decoupled
from the request/response
cycle entirely)
Why vocabulary precision matters beyond just sounding informed
[SENIOR INSIGHT] Precise vocabulary isn't pedantry — it's what lets a design conversation move quickly without constant re-explanation, and it's what lets you draw on this entire book series' deeper material by reference rather than re-deriving it from scratch in every conversation. Saying "we'd put a cache here" versus "we'd put a write-through cache with a 5-minute TTL here, invalidated explicitly on write" (Chapter 5's specific vocabulary) conveys a materially different, more complete design in the same number of words — precision is a form of compression that lets a design conversation cover much more ground in a fixed amount of time.
Common mistakes
- Using "cache," "queue," or "database" as if each were one undifferentiated thing, without the more precise vocabulary (write-through vs. cache-aside, message queue vs. pub/sub, relational vs. document) that actually communicates a specific design decision.
- Not being able to draw and narrate a basic request flow fluently, which is often the very first thing a system design conversation (interview or otherwise) needs to establish before any interesting complexity can even be discussed.
- Conflating synchronous request-path components with asynchronous, off-path components (a queue-driven background worker) as if they were interchangeable — they serve fundamentally different purposes (immediate response vs. decoupled, delayed processing).
- Re-deriving deep component mechanics from scratch in every system design conversation, rather than referencing established, precise vocabulary (from this book series' companion volumes) and spending the actual conversation time on the trade-off reasoning that's unique to the system at hand.
Checklist: using system design vocabulary effectively
- Use precise, specific terminology for each building block (write-through cache, leader-follower replication, message queue vs. pub/sub) rather than generic, undifferentiated terms.
- Practice drawing and narrating a basic request flow fluently, distinguishing the synchronous request path from asynchronous, off-path processing.
- Reference deeper component mechanics rather than re-deriving them — this book series' companion volumes (Database, Networking, Design Patterns) hold that depth; a system design conversation should build on it, not repeat it.
- Match vocabulary precision to the actual design decision being communicated — precise terms should convey a specific, meaningful choice, not just demonstrate familiarity with jargon.
Discussion / interview questions
-
"Draw and narrate the basic flow of a request through a typical, reasonably-scaled web system." Strong answer: Client → CDN (static assets) → load balancer → service (checking a cache first) → database (on a cache miss) → response back up the same path, with a separate note about asynchronous work flowing through a queue to background workers off the main request path.
-
"Why does precise vocabulary (e.g., 'write-through cache' vs. just 'cache') matter in a system design discussion?" Strong answer: Precise vocabulary compresses a complete, specific design decision into a few words, letting a conversation move faster and cover more ground without needing constant re-explanation — imprecise terms leave a design decision ambiguous or fully unstated.
-
"What's the difference between a system's synchronous request path and its asynchronous processing path?" Strong answer: The synchronous path handles a client's request and must respond within the request's lifetime (client → load balancer → service → database/cache → response); the asynchronous path (service → queue → background worker) handles work that can be decoupled from the immediate response, processed after the client has already received their reply.
-
"Why might a system design conversation reference the companion Database or Networking material rather than re-explaining those mechanics from scratch?" Strong answer: System design's actual value is in trade-off reasoning at the integration level — re-deriving deep component mechanics (how B-tree indexes work, how TCP handshakes function) from scratch wastes conversation time that should go toward the trade-offs unique to the specific system being designed.
Chapter summary / cheat sheet
- Core building blocks: client, load balancer, cache, CDN, queue/message broker, database, service — each with deep mechanics covered in this book series' companion volumes, referenced here rather than re-derived.
- A typical request flow: client → CDN → load balancer → service (cache-first) → database, with asynchronous work flowing separately through a queue to background workers.
- Precise vocabulary (write-through cache, leader-follower replication) compresses a complete design decision into few words — this is a genuine efficiency tool for design conversations, not pedantry.
- Fluency in drawing and narrating a basic request flow is a foundational skill nearly every system design conversation builds on.