Notes: Read vs Write -> Skews heavily towards reads
10,000 RPS means at least 20,000 RPS for checking and creating a short url (means we need a load balancer/request proceeor/gateway)
assume each short url is 8 characters -> 9 bytes per short url
-> 9 * 10000 = 90000 bytes per second -> roughly 9gb per day in just new short urls
assume each short url is 16 characters -> 17 bytes per short url
-> 17 * 10000 = 170000 bytes per second -> roughly 9gb per day in just new short urls -> 17 gb per day in long urls
each URL gets a integer for count metrics -> 4 bytes
Final Capacity per User
User -> user id + 9 + 17 + 4 bytes + timestamp(13 bytes) per user stored
Define what APIs are expected from the system...
Creation API:
Metrics API:
Retrieve API:
Use NOSQL database design
Table Called USERS
Each table in Users contains
USER ID: Unique String ID per USER (Partition Key)
SHORT URL: Short URL in string (Sort Key)
LONG URL: LONG URL in string
TTL: Short URL Time to Live (Timestamp)
Table Called USER_METRICS
Each table in USER_METRICS contains
USER ID: Unique String ID per USER (Partition Key)
SHORT URL: Short URL in string (Sort Key)
Metrics: Count of clicks
Gateway/Request -> Service/Server -> Database
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?