System Design HLD Example: URL Shortener (TinyURL and Bitly)
Core Mechanism & Implementation
A URL shortener is a read-heavy system (100:1 ratio) that maps long URLs to short, unique aliases.
🎯 System Scenario & Requirements
System Goal
A URL shortener is a read-heavy system (100:1 ratio) that maps long URLs to short, unique aliases.
Actors & Components
- Application or API tier
- Core service under design
- Operator or SRE observer
Functional Requirements
- A URL shortener is a read-heavy system (100:1 ratio) that maps long URLs to short, unique aliases.
- The core scaling challenge is generating unique IDs without database contention—solved using a Range-Based ID Generator or a Distributed Counter with Base62 encoding.
- A 301/302 redirect strategy combined with aggressive Redis caching ensures sub-10ms response times.
Constraints & Assumptions
- Observable outcome: - Range-Based Allocation solves the distributed counter bottleneck: each server claims a block of IDs from ZooKeeper and increments an in-memory counter locally, with zero per-request network coordin…
- After working through the stages, you should be able to explain: - In production deployments, the top 1% of links receive over 95% of redirect traffic.
⚡ Execution Stages & Decision Trace
Stage 1 — Production Considerations & Trade-offs
Observable outcome: - Range-Based Allocation solves the distributed counter bottleneck: each server claims a block of IDs from ZooKeeper and increments an in-memory counter locally, with zero per-request network coordin…
After working through the stages, you should be able to explain: - In production deployments, the top 1% of links receive over 95% of redirect traffic.
Deep Dive
Scenario context
A URL shortener is a read-heavy system (100:1 ratio) that maps long URLs to short, unique aliases. The core scaling challenge is generating unique IDs without database contention—solved using a Range-Based ID Generator or a Distributed Counter with Base62 encoding. A 301/302 redirect strategy combined with aggressive Redis caching ensures sub-10ms response times. This walkthrough focuses on **Lessons Learned…
This walkthrough focuses on Core Mechanism & Implementation.
Before making a design choice, clarify:
- This walkthrough focuses on Lessons Learned from Production URL Shortener Systems .
- In production deployments, the top 1% of links receive over 95% of redirect traffic.
- Standard LRU caching handles this well under steady state, but viral link events — a celebrity post, a product launch — can cause sudden cache misses on previously cold links.
Concepts in play: system-design-hld-architectures, caching, distributed-locking, event-driven-architecture
Stage 1 — Production Considerations & Trade-offs
- Observable outcome: - Range-Based Allocation solves the distributed counter bottleneck: each server claims a block of IDs from ZooKeeper and increments an in-memory counter locally, with zero per-request network coordin…
- After working through the stages, you should be able to explain: - In production deployments, the top 1% of links receive over 95% of redirect traffic.
- Standard LRU caching handles this well under steady state, but viral link events — a celebrity post, a product launch — can cause sudden cache misses on previously cold links.
- A URL shortener is a read-heavy system (100:1 read/write ratio).
Observable outcome: - - A URL shortener is a read-heavy system (100:1 read/write ratio).
End-to-end outcome
This walkthrough focuses on Lessons Learned from Production URL Shortener Systems .
Alternatives considered
The source focuses on one primary design. A second architecture is not compared, so no alternative is invented here.
Failure and degraded modes
Production Considerations & Trade-offs
- Detection: Observable outcome: - Range-Based Allocation solves the distributed counter bottleneck: each server claims a block of IDs from ZooKeeper and increments an in-memory counter locally, with zero per-req…
- User or operator impact: Observable outcome: - Range-Based Allocation solves the distributed counter bottleneck: each server claims a block of IDs from ZooKeeper and increments an in-memory counter locally, with zero per-req…
Key learnings
- Observable outcome: - Range-Based Allocation solves the distributed counter bottleneck: each server claims a block of IDs from ZooKeeper and increments an in-memory counter locally, with zero per-request network coordin…
