System requirements


Functional:

  • A user can generate a short URL from a long one
  • A user can customize the URL
  • A user can save the URL to it's profile
  • A user can update the URL
  • When entering the short URL into the browser, it will be redirected to the original long URL page


Non-Functional:

  • The system needs to be highly available
  • The system needs to handle a large amount of read request



Capacity estimation

1 url = 100 bytes

each day 1 million short URLs is created

We need 1 GB storage a day



API design

generateShortURL(originalURL, cuztomization): shortURL

getAllSavedURLs(user, id): url[]

updateURL(shortURL) : newShortURL




Database design

Need high scalability so we use noSQL to store URL to shortURL

A user database to store the URL a user created




High-level design

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...






Request flows

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...






Detailed component design

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...






Trade offs/Tech choices

Explain any trade offs you have made and why you made certain tech choices...






Failure scenarios/bottlenecks

Try to discuss as many failure scenarios/bottlenecks as possible.






Future improvements

What are some future improvements you would make? How would you mitigate the failure scenario(s) you described above?