Requirements


Functional Requirements:


  • User send a long URL.
  • System take that long URL
  • and return a unique short URL which will work exactly the same.
  • URL Directing: given short URL => redirect to the original URL.
  • user should be able to provide an optional custom alias for their short URL.
  • Support a default or user specified expiration date for links
  • Track and store click statitsics for each shortened link.


Non-Functional Requirements:


  • High Availability : The service must be always up so people can send their long URL and get a short URL.
  • Scalability: The system should be able to handle a large volume of requests.specificaly, it should scale horizontally to support an increase in number of read (redirections) and write requests(shortening)
  • Low Latency : Retrieving the short URL must be instant.
  • ShortURLs should not be easily "gussable".
  • Durability : Once Long URL added, it shouldnt be lost.


API Design

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 /v1/shorten

Request : {"longUrl" : "https://longUrl", "alias" : "testLongUrl"}

Response: {"shortLink": "https://shortLink"}

  • GET /v1/{shotURL}

Request: {"shortURL": "https://shortURL"}

Response: {"LongURL": "https://LongURL"}



High-Level Design

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.






Detailed Component Design

Deep dive into 2-3 key components. Explain how they work, how they scale, discuss tradeoffs, capacity, and any relevant algorithms or data structures.