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?