System requirements


Functional:

  • Create a new link
  • Access a generated link and redirect

Out of scope

  • Authentication
  • Expiration


Non-Functional:

  • Heavy read
  • Small write
  • High availability
  • Scalable (1 million DAUs, 10 million new links/day)
  • Fast link retrieval (~200ms)

Out of scope

  • Fault tolerance
  • Data privacy
  • Analytics



Capacity estimation

1 million DAUs

10 new links per user -> 10 million links/day generated



API design

POST /links -> Link object

Payload:

{

url: https://www.google.com

}


GET /links/{link_id} -> 301 redirect or 404 Not Found



Database design

Link

====

id: string

original_url: string

created_at: datetime



High-level 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?