List functional requirements for the system (Ask the chat bot for hints if stuck.)...
List non-functional requirements for the system...
Estimate the scale of the system you are going to design...
5 Million DAU
20 message per user avg
msg transfer TPS= 1,000
Peak TPS= 10,000
Avg msg size= 20 bytes
Total storage for 5 years= 365*5*5* 10^6* 20= 182 GB
avg multimedia size = 1 Mb
Total multimedia storage for 5 years= * 1.82 GB = 1.82 TB
Define what APIs are expected from the system...
Defining the system data model early on will clarify how data will flow among different components of the system. Also you could draw an ER diagram using the diagramming tool to enhance your design...
We require high scale, high availability, structured data, high write and read both.
Hence we will use a NoSQL DB like Casandra.
MESSAGE DB:
MESSAGE TABLE
MessageId:
Content:
Image URL in S3:
SenderID
ReceiverId
Timestamp
USER TABLE
UserId:
UserName:
UserProfile
......
GROUP DB:
GROUP TABLE
GroupId:
MemberId:
JoiningDate
IsAdmin
...
You should identify enough components that are needed to solve the actual problem from end to end. Also remember to draw a block diagram using the diagramming tool to augment your design. If you are unfamiliar with the tool, you can simply describe your design to the chat bot and ask it to generate a starter diagram for you to modify...
Explain how the request flows from end to end in your high level design. Also you could draw a sequence diagram using the diagramming tool to enhance your explanation...
Send Msg flow for 1: 1 chat:
Send msg flow for group chat:
Sending Images
Dig deeper into 2-3 components and explain in detail how they work. For example, how well does each component scale? Any relevant algorithm or data structure you like to use for a component? Also you could draw a diagram using the diagramming tool to enhance your design...
Chat Servers:
Message Sync Queue:
It is a distributed queue like Kafka responsible from sending a msg from one chat server to another in order.
Client Connection Cache:
It is a in memory cache responsible for storing the user and server holding the connection details, so a message can be sent to recipient server.
UserId: ServerId
Message Server:
Service responsible for retrieving message from sync queue and storing in DB.
Group Service:
Service responsible for managing all group related tasks like group creation, adding/ removing/ retrieving members of a group.
CDN
Sent/ Delivered and Read Status
Last Seen/Online
Explain any trade offs you have made and why you made certain tech choices...
Try to discuss as many failure scenarios/bottlenecks as possible.
What are some future improvements you would make? How would you mitigate the failure scenario(s) you described above?