How Do You Design a Social Media Timeline?
Learn how to design a social media timeline with hybrid fan-out-on-write and fan-out-on-read, feed caching, and ranking.
Expected Interview Answer
A social media timeline is built with a hybrid fan-out approach: posts from most users are pushed into each follower’s precomputed feed at write time (fan-out-on-write), while posts from celebrities with huge follower counts are pulled and merged at read time (fan-out-on-read), balancing write cost against read latency.
Pure fan-out-on-write pushes a new post into every follower’s feed cache the moment it is created, which makes reads instant but explodes in cost for accounts with millions of followers — a single post could trigger millions of writes. Pure fan-out-on-read instead computes the feed live by fetching recent posts from everyone a user follows and merging them at request time, which is cheap to write but slow to read as follow counts grow. Production systems use a hybrid: regular users get fan-out-on-write into a per-user feed cache (often Redis sorted sets keyed by user ID, storing post IDs ranked by time or a ranking score), while celebrity posts are excluded from mass fan-out and instead pulled on demand and merged into the requester’s feed. Ranking then reorders the merged candidate set using signals like recency, affinity, and engagement rather than showing a strict chronological feed.
- Fan-out-on-write gives most users near-instant feed reads from a precomputed cache
- Fan-out-on-read for celebrity accounts avoids catastrophic write amplification
- Feed caches decouple read latency from the size of a user’s social graph
- Separating fan-out from ranking lets each concern scale and evolve independently
AI Mentor Explanation
Building a timeline is like a scoreboard operator who, for most matches, pushes every ball’s update directly to each subscribed fan’s personal scorecard the instant it happens, so checking your card is instant. For a mega-final with millions of fans, though, pushing to every card individually would be impossible, so the operator instead keeps one master feed and lets each fan’s app pull and merge it in when they check. The final scorecard a fan sees blends both the pushed updates and the pulled master feed, sorted by time. That mix of pushing for small audiences and pulling for massive ones is exactly how a social timeline balances write and read cost.
Step-by-Step Explanation
Step 1
Classify accounts by follower count
Split users into regular accounts (fan-out-on-write) and high-follower celebrity accounts (fan-out-on-read) based on a threshold.
Step 2
Fan out regular posts on write
When a regular user posts, push the post ID into every follower’s precomputed feed cache (e.g. Redis sorted set by timestamp).
Step 3
Pull celebrity posts on read
When a user requests their feed, fetch recent posts from any celebrity accounts they follow directly, rather than via fan-out.
Step 4
Merge and rank
Combine the precomputed feed with pulled celebrity posts, then re-rank by recency, affinity, and engagement before returning the response.
What Interviewer Expects
- Explains both fan-out-on-write and fan-out-on-read and their respective trade-offs
- Proposes a hybrid strategy keyed on follower count to avoid celebrity write amplification
- Mentions a concrete feed cache design (e.g. Redis sorted sets per user)
- Distinguishes fan-out (retrieval) from ranking (ordering) as separate concerns
Common Mistakes
- Proposing pure fan-out-on-write without addressing celebrity accounts
- Proposing pure fan-out-on-read without addressing read latency at scale
- Confusing the feed cache with the source-of-truth post database
- Ignoring ranking entirely and assuming timelines are strictly chronological
Best Answer (HR Friendly)
“Designing a social media timeline is about deciding when to do the work: for most people, we push their new post straight into their followers’ feeds right away so reading is instant. For a huge celebrity account, pushing to millions of feeds at once would be too expensive, so we instead pull their posts in only when a follower actually opens their feed and combine everything before showing it.”
Code Example
CELEBRITY_FOLLOWER_THRESHOLD = 1_000_000
def publish_post(author_id, post_id, created_at):
store_post(post_id, author_id, created_at) # source of truth
if get_follower_count(author_id) < CELEBRITY_FOLLOWER_THRESHOLD:
# fan-out-on-write: push into every follower feed cache
for follower_id in get_followers(author_id):
feed_cache.zadd(f"feed:{follower_id}", {post_id: created_at})
# else: skip fan-out, post is fetched on read via pull path
def get_timeline(user_id, limit=20):
precomputed = feed_cache.zrevrange(f"feed:{user_id}", 0, limit)
celeb_posts = []
for celeb_id in get_followed_celebrities(user_id):
celeb_posts.extend(get_recent_posts(celeb_id, limit))
merged = merge_and_rank(precomputed, celeb_posts, user_id)
return merged[:limit]Follow-up Questions
- How would you handle a user unfollowing someone whose posts are already fanned out into their feed?
- How do you re-rank a feed beyond strict chronological order without making it feel unpredictable?
- How would you paginate a timeline efficiently when the underlying feed is constantly updated?
- What happens to feed generation if the fan-out worker queue falls behind during a traffic spike?
MCQ Practice
1. Why do large systems avoid pure fan-out-on-write for every account?
Fanning out one post to millions of followers at write time causes extreme write amplification, so celebrity accounts are usually pulled instead.
2. What does the hybrid fan-out strategy typically use to decide push vs pull?
Accounts below a follower threshold use fan-out-on-write; accounts above it are pulled on read to avoid write amplification.
3. What is the role of ranking in a timeline system, separate from fan-out?
Fan-out determines which posts are candidates for a feed; ranking is the separate step that orders them for display.
Flash Cards
Fan-out-on-write? — Push a new post into every follower’s feed cache at write time, making reads instant but writes expensive at scale.
Fan-out-on-read? — Compute a feed at read time by pulling recent posts from followed accounts, keeping writes cheap but reads slower.
Why use a hybrid approach? — To get fast reads for typical accounts while avoiding catastrophic write amplification from celebrity accounts.
What powers a per-user feed cache? — Often a Redis sorted set keyed by user ID, storing post IDs ranked by timestamp or score.