Functional requirements:
Non-functional requirements
Assumption:
200 million DAU, each user post 3 tweets per day = 600 million tweet per day.
Each tweet with 140 bytes as content and 30bytes as metadata, and 20% of them contains photo 20KB, and 10% of contains 2Mb video.
Each user read 5 times hometimeline and 5 times other user's timeline, each timeline contains 20 tweets.
Data storage:
so the total size will be: 600m * (170bytes + 20kb * 30% + 2Mb * 10%) = 180TB per day
Bandwidth: 200 million * (5 + 5) * 20 * (140 bytes + 10 % * 2Mb + 20% * 20kb) / 86400 = 120 GB/s
I'd choose MongoDB as our database, because:
Database design:
Tweet:
TweetID: Integer, primary key
content: Varchar(140)
Metadata: Varchar(30)
....
User:
userId: Integer, primary key
email: varchar(30)
isHotUser: Boolean
Follower:
followerUserId: Integer
FolloweeUserId: Integer
FollowingDate: Timestamp
Can see from the high level diagram