Design Amazon S3 from an empty canvas: PUT, GET and LIST objects at 1,500 requests a second, with the bytes on erasure-coded storage nodes and the metadata in a key-value store.
Unlock it once for 25 credits; everything inside it is free (runs, changes, Submit, results, hints). Sign in with Google to start; new accounts get free credits.
What it must do
PUT an object into a bucket under a key, and GET it back by bucket and key.
LIST the keys in a bucket by prefix.
Never lose an object: it stays readable when a storage node dies.
Serve hot objects fast without reading the disks every time.
Scale
1,500 requests a second: 1,050 GETs, 375 PUTs and 75 LISTs (70% / 25% / 5%).
PUTs average 256 KB: about 96 MB a second of new data, roughly 250 TB a month.
Objects are erasure coded 6+3 (six data fragments, three parity) across storage nodes.
Reads are skewed: a small set of hot objects gets about 60% of GETs. Responses average 4 KB.
Request types to route: get (70%, read), put (25%, write), list (5%, read). Budget: $4,600 a month.
Estimate first
New object data a month (TB)
Raw disk for that month of data with 6+3 erasure coding (TB)
Requests a second reaching the storage nodes on a normal day (req/s)
Monthly cloud cost of your design (USD)
The test cases
You start from an empty canvas. When you run the tests, each one simulates your design with its own traffic and failures:
Test
What it does
Passes when
Normal day
The normal day: the traffic in the brief, nothing broken.
Success ≥ 99.9%; p99 latency ≤ 100 ms (get); p99 latency ≤ 150 ms (put)
Peak: 2× traffic
At 5 s a product launch doubles traffic for 8 s.
Success ≥ 99%; p99 latency ≤ 150 ms (get)
A server dies
At 4 s one server of the first app service on the request path dies for 10 s.
Success ≥ 99%
A storage node dies
At 5 s a storage node on the request path crashes (the first one a request meets); it restarts 10 s later.
Success ≥ 99% (get); Success ≥ 99% (put)
Budget: $4,600/month
The normal day's design must cost at most $4,600 a month.
Cost ≤ $4,600/month
Must include
Storage nodes for the bytes. Object bytes live on raw disks, split into erasure-coded fragments across many nodes: this is what S3 is built from.
A metadata store. Every object needs a record keyed by bucket and key that says where its fragments are; LIST reads it by prefix.
A cache for hot objects. A few objects get most GETs: serving them from memory keeps the disks for everything else.