Requirements


Functional Requirements:


  • Allow users to tweet messages up to 140 characters.
  • Enable users to follow other users.
  • Allow users to like tweets from other users.
  • Display tweets from followed users in the home feed.
  • Show top K popular tweets in the home feed based on likes and followers.



Non-Functional Requirements:


  • highly available for users to see posts
  • Able to scale among regions
  • Durable data


Capacity Estimation

Estimate the scale of the system. Consider daily active users, read/write ratio, storage requirements, bandwidth, and any relevant QPS calculations...




API Design

REST APIs

POST /tweet

-- messages

-- user_id

-- topic

-- timestamp


POST /follow/{user_id}

POST /like/{tweet_id}

GET /tweet/{user_id} # get tweet from a user

GET /toptweets/{k} # get top k tweets




High-Level Design

The request starts from the client and goes to API gateway, then it goes to tweet service (for APIs like post a tweet, add likes to a tweet, get all tweets from a user) or user service (for APIs about the user, like follow a user)

When the user posts a tweet, the request goes to tweet service through API gateway, and the parsed data from tweet service will be stored in the Mongo database's tweet table, with clear info of tweet id, messages, user id, timestamp and etc.





Database Design

DynamoDB


Tweet table:

tweet id (primary key)

user id

topic

message

timestamp

likes amount

user likes the tweet []


Follow table

user id

followed user id

created at


User table

user id (primary key)

followers []



Detailed Component Design

  1. CDN can be added to store static files like pictures, profile photo, videos and etc.
  2. Redis can be added to store top-k tweets
  3. With high scalability, both tweet service and user service can be horizontally partitioned with replicas; Add sharding to database with shard id as tweet id for tweet table, shard is as user id for user table.
  4. Add message queue like Kafka to handle concurrent or multiple requests,