Instagram is a photo-sharing social platform where users publish images, follow other accounts, and browse a home feed composed of recent photos from the accounts they follow. On the surface it appears as a straightforward photo grid, but underneath the system must ingest and deliver images while constructing feeds from the same follow graph and durable post store.
Instagram presents a feed problem with a notable twist. Each photo post initiates an asynchronous media processing lifecycle that must complete before a feed can display the image. The design must keep home-feed reads inexpensive, wait for images to become renderable, and avoid pushing a celebrity post into millions of follower feeds synchronously.
Out of scope (below the line)
99.9% availability for photo upload and home-feed reads in a healthy region.p95 < 300 ms for upload acknowledgement (ACK) after durable metadata persist, before full processing completes.p95 < 300 ms for the first home-feed page from a warm regional stack.50M daily active users (DAU), 300k/s peak home-feed reads, 5k/s peak photo uploads, 15B+ follow edges, and celebrity accounts with 10M+ followers.O(follower_count) work for large authors.| Quantity | Assumed value | Used for |
|---|---|---|
| Daily active users | 50M | feed read pressure and cache sizing |
| Peak home-feed read queries per second (QPS) | 300k/s | home-feed service and materialized timeline throughput |
| Peak photo upload QPS | 5k/s | upload path, media pipeline throughput, and fanout worker sizing |
| Total follow edges | 15B+ | follow-graph storage and celebrity detection |
| Large author followers | 10M+ | hybrid fanout threshold design |
| Average original photo size | 2-5 MB | object storage write volume and upload path design |
| Processed renditions per photo | 3 (thumb, standard, full) | media pipeline throughput and CDN origin storage |
| Typical post metadata | 1-2 KB | SQL write size and projection payload design |
At 5k uploads per second, the media pipeline processes roughly 15k renditions per second. Each original photo is 2-5 MB, so raw upload ingress alone is 10-25 GB/s into object storage. These numbers justify why image bytes must never flow through the application server and why presigned URLs are the standard upload pattern.