🇮🇳
🇮🇳
Republic Day Special Offer!Get 20% OFF on all courses
Enroll Now
P
Prakalpana
📚Learn
Code Your Future
System Design⏱️ 22 min read📅 Jan 4

HLD: Design Twitter - Timeline and Tweet Distribution

SG
Sneha GuptaStaff Engineer at Twitter
📑 Contents (11 sections)

📌Problem Statement

Design a social media platform like Twitter for posting tweets and following users.

📌Requirements

Functional

  • Post tweets (280 chars, images, videos)
  • Follow/unfollow users
  • Home timeline
  • User timeline
  • Like, retweet, reply
  • Search tweets
  • Trending topics
  • Scale

  • 500M users, 200M DAU
  • 500M tweets/day
  • Each user follows 200 people on average
  • 📌High-Level Design

    System Architecture
    Live
    Mobile/Web Client
    Load Balancer
    Nginx
    API Gateway
    Tweet Service
    Timeline Service
    User Service
    Search Service
    Kafka
    Event Bus
    Fanout Service
    Trending Service
    Notification Service
    Redis
    Timeline Cache
    Cassandra
    Tweets DB
    Elasticsearch
    CDN
    Media
    ⚡ High Availability🔄 Auto-scaling🛡️ Fault Tolerant

    Tweet Posting Flow

    public class TweetService {
    public Tweet postTweet(String userId, String content, List<Media> media) {
    Tweet tweet = new Tweet(userId, content, media);
    tweetRepository.save(tweet);
    kafkaTemplate.send("tweet-events", new TweetCreatedEvent(tweet));
    return tweet;
    }
    }
    public class FanoutService {
    public void processTweetEvent(TweetCreatedEvent event) {
    String userId = event.getTweet().getUserId();
    int followerCount = userService.getFollowerCount(userId);
    if (followerCount < 10000) {
    List<String> followers = userService.getFollowers(userId);
    for (String followerId : followers) {
    timelineCache.addToTimeline(followerId, event.getTweet());
    }
    }
    }
    }

    Timeline Generation

    public class TimelineService {
    public List<Tweet> getHomeTimeline(String userId, int limit) {
    List<Tweet> timeline = new ArrayList<>();
    timeline.addAll(timelineCache.getTimeline(userId, limit));
    List<String> celebrities = userService.getCelebritiesFollowed(userId);
    for (String celeb : celebrities) {
    timeline.addAll(tweetRepository.getRecentTweets(celeb, 20));
    }
    timeline.sort((a, b) -> b.getCreatedAt().compareTo(a.getCreatedAt()));
    return timeline.stream().limit(limit).collect(Collectors.toList());
    }
    }

    📌Database Schema

    CREATE TABLE tweets (
    tweet_id BIGINT PRIMARY KEY,
    user_id BIGINT,
    content VARCHAR(280),
    media_urls TEXT[],
    created_at TIMESTAMP,
    like_count INT DEFAULT 0,
    retweet_count INT DEFAULT 0
    );
    CREATE TABLE followers (
    user_id BIGINT,
    follower_id BIGINT,
    created_at TIMESTAMP,
    PRIMARY KEY (user_id, follower_id)
    );
    CREATE TABLE user_timeline (
    user_id BIGINT,
    tweet_id BIGINT,
    created_at TIMESTAMP,
    PRIMARY KEY (user_id, created_at, tweet_id)
    );

    public class TrendingService {
    private RedisTemplate<String, Integer> redis;
    public void trackHashtag(String hashtag) {
    String key = "trending:" + getCurrentWindow();
    redis.opsForZSet().incrementScore(key, hashtag, 1);
    redis.expire(key, Duration.ofHours(24));
    }
    public List<String> getTrending(int limit) {
    String key = "trending:" + getCurrentWindow();
    return redis.opsForZSet()
    .reverseRange(key, 0, limit - 1)
    .stream()
    .map(Object::toString)
    .collect(Collectors.toList());
    }
    }

    📌Search with Elasticsearch

    public class SearchService {
    public List<Tweet> searchTweets(String query, int page, int size) {
    SearchRequest request = new SearchRequest("tweets");
    request.source(new SearchSourceBuilder()
    .query(QueryBuilders.multiMatchQuery(query, "content", "hashtags"))
    .from(page * size)
    .size(size)
    .sort("created_at", SortOrder.DESC)
    );
    return elasticsearchClient.search(request);
    }
    }

    📌Key Design Decisions

  • 1Hybrid Fanout: Push for normal users, pull for celebrities
  • 2Redis for Timeline: Fast read, limited storage
  • 3Cassandra for Tweets: Write-heavy, time-series
  • 4Kafka for Events: Decouple services, async processing
  • Asked at Twitter, Meta, and Google interviews.

    SG

    Written by

    Sneha Gupta

    Staff Engineer at Twitter

    🚀 Master System Design

    Join 500+ developers

    Explore Courses →
    Chat on WhatsApp