We have a pretty simple design:
We have two main flows to cover:
For the first one a request first goes to a load balancer and is dispatched to a proper instance (taking current load into consideration) of a shortener service, which generates a new one, puts it in the DB. Then it returns the result to the user.
For the second case a request also starts from going to the load balancer, but then it gets routed to a redirection service. It first checks its own cache and if the record for the shortened url cannot be found goes to the DB and then either returns an error to the user or puts the original URL to cache and redirects the user.
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...