Functional Requirement :
1) User generate short url for big url
2) User is able to redirect to the orginal link from the short url
3) User can create profile and create url associated with its profile
Non functional requirement
1) Scalable -> add more url, and server more redirect
2) Latency -> 5ms ?
3) Available -> as much as possible
4) Read Heavy
API Design
Get /shortCode -> redirect to big url
Post { bigurl } -> return { shortUrl , expiry }
High-Level Design
client -> gateway -> user Service -> userDb
UserDb { id , userName , name , emailId , phoneNumber }
For user data, PostgreSQL is usually better because:
- User schema is stable
- Relationships and constraints matter
- Strong consistency is important
MongoDB can be considered if:
- Schema changes frequently
- Massive horizontal scaling is required
- Product evolves rapidly
client -> gateway -> url Service -> urlDb
urlDb{ id , shortUrl , longUrl , expiry }
Redis vs Postgresql
PostgreSQL
Used as:
- Source of truth
- Permanent storage
Redis
Used as:
- Cache layer
- Fast URL resolution
- TTL-based expiration
Detailed Component Design
High available -> Url and User service should be horizontal scalable and managed by eks so they are not
Low Latency -> reduce the call using redis, instead of db
Horizontal Scalability -> make the services horizontal scalable
Concurrent request ? how is that a issue, like multiple read can be supported using redis, and even if multiple reads on same row is it supported
Cache miss ? do we have to persist it somewhere else ?
Avoid Collisions -> avoid collision of url generation so in this we can have 7 bit uuid generation which will be unique