System Design Thinking
Notes on breaking architecture problems into parts and choosing solutions for scale, reliability, latency, and cost.
Theory
Introduction to system design
6 min read
System requirements
7 min read
Functional requirements
5 min read
High availability
9 min read
Fault tolerance, resilience, and reliability
7 min read
Scalability
5 min read
Performance
8 min read
Durability
7 min read
Consistency
8 min read
Maintainability, security, cost
8 min read
Summary of system requirements
2 min read
Regions, availability zones, data centers, servers
8 min read
Physical servers, virtual machines, containers, serverless
5 min read
Synchronous vs asynchronous communication
3 min read
Asynchronous messaging patterns
4 min read
Network protocols
6 min read
Blocking vs non-blocking IO
9 min read
Data encoding formats
6 min read
Message acknoledgement
3 min read
Deduplication cache
7 min read
Metadata cache
7 min read
Queue
3 min read
Full and empty queue problems
7 min read
Start with something simple
2 min read
Blocking queue and producer-consumer pattern
5 min read
Thread pool
5 min read
Big compute architecture
3 min read
Log
5 min read
Index
6 min read
Time series data
2 min read
Simple key-value database
5 min read
B-tree index
6 min read
Embedded database
4 min read
RocksDB
6 min read
LSM-tree and B-tree
6 min read
Page cache
6 min read
Push vs pull
5 min read
Host discovery
8 min read
Service discovery
6 min read
Peer discovery
9 min read
How to choose a network protocol
6 min read
Network protocols in real-life systems
8 min read
Video over HTTP
7 min read
CDN
4 min read
Push and pull technologies
8 min read
Push and pull technologies in real-life systems
5 min read
Large-scale push architectures
8 min read
What else to know to build reliable, scalable, and fast systems
5 min read
Timeouts
3 min read
What to do with failed requests
5 min read
When to retry
6 min read
How to retry
4 min read
Message delivery guarantees
6 min read
Consumer offsets
6 min read
Batching
6 min read
Compression
4 min read
How to scale message consumption
6 min read
Partitioning in real-life systems
3 min read
Partitioning strategies
5 min read
Request routing
6 min read
Rebalancing partitions
7 min read
Consistent hashing
7 min read
System overload
2 min read
Autoscaling
4 min read
Autoscaling system design
5 min read
Load shedding
7 min read
Rate limiting
9 min read
Synchronous and asynchronous clients
7 min read
Circuit breaker
3 min read
Fail-fast design principle
6 min read
Bulkhead
5 min read
Shuffle sharding
6 min read
The end (but not quite
2 min read