System requirements
Functional:
- Given a short url, redirect to the long url
- Redirection should be consistent.
- Analytics?
Non-Functional:
- support 100b unique urls.
Capacity estimation
Support the DAU is 1 million and each user generates 10 short urls per day.
The storage is 1m * 10 * 100 = 1GB every day.
API design
get(string shortUrl) -> string longUrl
create(string longUrl) -> string shortUrl
Database design
{shortUrl, longUrl}
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?