List functional requirements for the system (Ask the chat bot for hints if stuck.)...
To take a url and shorten it to a unique url with max of 15 tokens
Give the option for a custom tinyUrl link
Track the link data for clicks
Custom Link expiration settings
Edit/Delete link
Create account that links the links created by the user to view stats
List non-functional requirements for the system...
Highly reliable -- we need the links to work when users click them
Highly scalable -- we need to support about 1M links created per day and 10M link clicks per day
Highly consistent -- each link should always provide the most up to date link -- but we can potentially sacrafice a small bit of consistency for availability. i.e: if a user edits a tinyurl link to a new link, it is better to be available a user that clicks it right after it is changed may see the old link rather than not be available at all
Estimate the scale of the system you are going to design...
1M links created per day
10M Link clicks per day
Define what APIs are expected from the system...
createUrl(devId, originalUrl, customDomain:optional, expirationDateTime)
-devId: used to associate creator of link/billing/account/etc
returns json
{
newLink: string
clickCount: int
expirationDateTime: datetime string
}
getUrls(devId)
returns urls from devid to present statisitcs
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...
Nosql Database -- other than user link statistics there is not much to relate in this database, so nosql like MongoDB will be better
user collection where each document has the following fields
username
devId (pk)
accountCreationDate
links (array to links that they have created)
Active link collection
link (pk)
clicks : int
expirationTime
createdTime
inactiveLink collection
link (pk)
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...
The client will first access a loadbalancer that will distrivute load to the application servers. Each server will have redundancies via api gateway. There will be a server for createUrl, which then makes a request to inactiveLink DB and those links aregenerated by another link generation service that uses a hashing technique to not have any duplicates. There will be about 50 billion unique keys ready and populated
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...
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...
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?