System Design Fundamentals
Distributed Systems Building Blocks
The last three building blocks that show up in almost every real distributed system: decoupling work with queues, pushing content physically closer to users, and — the one every design is ultimately judged on — what happens when a piece of the system fails.