This map follows the video "They have Kubernetes and unlimited budget, yet it still falls over". Instead of memorizing one diagram, it follows the path of the load and shows which problem each layer solves.
The order is deliberate: frame the problem, protect the door, lighten reads, queue writes, then make it resilient and visible. Each step exists because the previous one wasn't enough.
Click a topic to see what you need to know and where to learn it.
Adding servers isn't enough: the bottleneck is always the shared part. Frame the problem first.
Cutting load before it reaches the database is cheaper than chasing it.
Most traffic is reads. Stop fetching the same data from the database over and over.
Don't push heavy work straight into the database; queue it and digest it steadily.
Something will break. What matters is that everything doesn't fall together and that you can see what broke.
Every topic on the map with its description, what to know and resources — in one list.
Vertical scaling makes the machine bigger; horizontal scaling adds more of them. App servers scale horizontally; the database is usually where it jams first.
Move sessions and files out of server memory so any server can replace any other.
A single database every server talks to, a single component in the middle: when it falls, everything does.
Connections, disk and locks are finite. When twenty servers send thousands of writes at once, the connection limit fills up and requests queue behind each other.
Share a limited set of connections instead of opening one per request; protects the database from connection storms.
Spreads incoming traffic across healthy servers and removes dead ones. Without a single entry point, horizontal scaling means nothing.
The app reports its own health so the balancer stops sending traffic to a sick server.
Caps how many requests a client, or everyone, can make per second; excess load is rejected before it gets in so the system stays up.
For ticket drops: queue users and let them in at a pace the system can handle.
Images, scripts and unchanging pages are served from edge locations near the user; the origin never sees them.
A fast in-memory layer for hot data. It removes most reads from the database, but misconfigured it creates its own problems.
Check the cache first; on a miss read the database, populate the cache, then return. The most common, simplest pattern.
When and how to drop the stale copy when data changes: one of the hard problems in computing.
The moment a hot key expires, hundreds of thousands of requests miss the cache and hit the database at once. The video's main warning.
A small random offset on expiry so keys written together don't expire together.
Only one request per key goes to the database; the others wait for it or take the stale value.
Writes go to one primary, reads to one or more copies. Read load is spread across the replicas.
Heavy work like ticket sales and orders goes into a queue first, and workers drain it at their own pace. The spike is absorbed by the queue and the database stays calm.
RabbitMQ is for task distribution; Kafka for high-volume event streams and replay. Either is enough for your first queue.
Slow down or reject producers when consumers can't keep up, so the queue doesn't grow forever.
The same message can be processed twice from a queue; to avoid charging twice, the operation must be safe to repeat.
Separating the write model from the read model; each scales and stores to its own needs.
Stops sending requests to a dependency that isn't responding for a while, so the rest of the system doesn't go down with it.
Tools like Kubernetes add app servers based on load; the database can't do that automatically, which is why the earlier layers matter.
You can't scale what you can't see. Before the big day, load the system on purpose and learn where it breaks.