Files
leetcode/apps/docs/content/system-design/(02-core-designs)/11-news-feed-system.mdx
T

153 lines
5.5 KiB
Plaintext
Raw Normal View History

2026-10-07 14:18:14 -04:00
---
title: "Design a News Feed System"
description: "Publish posts and build each user's feed with fanout on write, fanout on read, and layered caches."
icon: newspaper
sidebar:
label: "News Feed System"
---
## Introduction
A **news feed system** displays a constantly updating list of posts (status updates, photos, videos, and links) from a user’s connections. Examples include Facebook’s news feed, Instagram’s feed, and Twitter’s timeline. This chapter explores the design of a scalable news feed system.
---
## Step 1: Understanding the Problem
### Requirements
1. **Platform:** The system supports both web and mobile apps.
2. **Features:**
- Users can publish posts.
- Users can view posts from friends in their news feed.
3. **Sorting:** Feeds are sorted in **reverse chronological order** for simplicity.
4. **Scale:**
- Users can have up to 5,000 friends.
- 10 million daily active users (DAU).
- Feeds may include text, images, and videos.
---
## Step 2: High-Level Design
### Overview
The design includes two main flows:
1. **Feed Publishing:** A user publishes a post, which is written to the database and propagated to their friends’ feeds.
2. **News Feed Building:** A user retrieves their news feed by aggregating posts from friends in reverse chronological order.
---
### News Feed APIs
1. **Feed Publishing API:**
- **Endpoint:** `POST /v1/me/feed`
- **Params:** `content` (post text) and `auth_token` (authentication).
2. **News Feed Retrieval API:**
- **Endpoint:** `GET /v1/me/feed`
- **Params:** `auth_token` (authentication).
---
### Feed Publishing
<Frame caption="Feed Publishing">
![Feed Publishing](./images/news-feed-system/feed-publishing.png)
</Frame>
1. **User Interaction:** The user publishes a post via the feed publishing API.
2. **Load Balancer:** Distributes traffic to web servers.
3. **Web Servers:** Authenticate requests and redirect to services.
4. **Post Service:** Stores the post in the database and cache.
5. **Fanout Service:** Propagates the post to friends’ news feeds in the cache.
6. **Notification Service:** Sends notifications to friends.
---
### News Feed Building
<Frame caption="News Feed Building">
![News Feed Building](./images/news-feed-system/news-feed-building.png)
</Frame>
1. **User Interaction:** The user requests their news feed via the retrieval API.
2. **Load Balancer:** Distributes traffic to web servers.
3. **Web Servers:** Forward requests to the news feed service.
4. **News Feed Service:** Fetches post IDs from the news feed cache and retrieves complete post details from the database or cache.
---
## Step 3: Design Deep Dive
### Feed Publishing Deep Dive
1. **Web Servers:**
- Authenticate users using `auth_token`.
- Enforce rate limits to prevent spam.
2. **Fanout Service:**
- **Fanout on Write:** Push posts to friends’ feeds at write time.
- **Pros:** Real-time updates, fast feed retrieval.
- **Cons:** Resource-intensive for users with many friends.
- **Fanout on Read:** Pull posts at read time.
- **Pros:** Efficient for inactive users.
- **Cons:** Slower feed retrieval.
- **Hybrid Approach:** Use a push model for most users and a pull model for high-connection users (e.g., celebrities).
<Frame caption="Feed Publishing Deep Dive">
![Feed Publishing Deep Dive](./images/news-feed-system/feed-publishing-deep-dive.png)
</Frame>
The **fanout service** works as following:
1. **Fetch Friend IDs:** Retrieve the friend list from a graph database.
2. **Filter Friends from Cache:** Access user settings in the cache to exclude certain friends (e.g., muted friends or selective sharing preferences).
3. **Send to Message Queue:** Send the filtered friend list along with the new post ID to a message queue for processing.
4. **Fanout Workers:** Workers retrieve data from the message queue and update the news feed cache. The cache stores `<post_id, user_id>` mappings instead of full user and post objects to save memory.
5. **Store in News Feed Cache:** Append new post IDs to the friends’ news feed cache. A configurable limit ensures that only recent posts are stored, as most users focus on the latest content, keeping cache memory consumption manageable.
<Frame caption="Fanout Service">
![Fanout Service](./images/news-feed-system/fanout-service.png)
</Frame>
## News Feed Retrieval Deep Dive
### Cache Architecture
The cache is divided into five layers:
1. **News Feed Cache:** Stores post IDs for quick retrieval.
2. **Content Cache:** Stores post details (popular posts in hot cache).
3. **Social Graph Cache:** Stores user relationship data.
4. **Action Cache:** Tracks user actions (likes, replies, shares).
5. **Counter Cache:** Maintains counts for likes, replies, followers, etc.
<Frame caption="Cache Architecture">
![Cache Architecture](./images/news-feed-system/cache-architecture.png)
</Frame>
---
## Key Optimizations
### Scaling
1. **Database Scaling:**
- Horizontal scaling and sharding.
- Use of read replicas for high-traffic queries.
2. **Stateless Web Tier:** Keep web servers stateless to enable horizontal scaling.
### Caching
1. Store frequently accessed data in memory.
2. Use cache layers to reduce latency and database load.
### Reliability
1. **Consistent Hashing:** Distribute requests evenly across servers.
2. **Message Queues:** Decouple system components and buffer traffic.
### Monitoring
1. Track key metrics like QPS (queries per second) and latency.
2. Monitor cache hit rates and adjust configurations accordingly.