List the key functional requirements for the system (Ask the AI for hints if stuck)...
List the key non-functional requirements (performance, scalability, reliability, etc.)...
Estimate the scale of the system. Consider daily active users, read/write ratio, storage requirements, bandwidth, and any relevant QPS calculations...
Define the APIs expected from the system. This is your chance to analyze and define the read and write paths so that you can come up with the high-level design...
POST: /api/v1/urls { "longurl: "...."} -> 201 + { "shorturl": "....."}
GET: /{shorturl} -> 302 original url
Describe the overall system architecture. Identify the main components needed to solve the problem end-to-end. Use the diagramming tool to create a block diagram.
entry start at load balance to 2 services: create new url and redirection service
URL generator: create a new short url from long one. Create a unique code per request
Database: stores newly generated urls:
Caching to avoid going directly to DB
Define the data model. Identify the main entities, their attributes, and relationships. Consider the choice of database type (SQL vs NoSQL) and justify your decision based on access patterns...
SQL database: each row defines a request stores short and long url with unique id created by url generator
table:
id,
short url
long url
created at:
DB index at short url column
Scaling by sharding by hashing short url column
strong consistency with creation, eventual for redirection
Deep dive into 2-3 key components. Explain how they work, how they scale, discuss tradeoffs, capacity, and any relevant algorithms or data structures.
Load balancer to manage traffic. Can use round robin assuming multiple creation instance with equal capability.
Creating serive uses external url generator for hashing new urls
Cache uses redis using short url and long url as key value pairs. Uses read thru cache