Giao diện
Thực hành: Thiết kế URL Shortener
🎯 Mục tiêu
🎯 Sau bài thực hành này, bạn sẽ:
- Thiết kế hệ thống URL shortener xử lý 100M URLs
- Đánh giá trade-off SQL vs NoSQL cho URL mapping
- Chọn hash function và xử lý collision
- Thiết kế caching layer tối ưu redirect latency
Yêu cầu hệ thống
Functional: Tạo short URL (7 ký tự), redirect, custom alias, expiration, click analytics.
Non-functional: 99.99% uptime, redirect dưới 100ms (p99), 100M URLs, read/write ratio 10:1.
Ước lượng
| Metric | Giá trị |
|---|---|
| Write QPS | ~120 (1M URLs/day) |
| Read QPS | ~1,200 |
| Storage 5 năm | ~912 GB |
| Cache (20% hot) | ~180 GB |
Kiến trúc
Thiết kế chi tiết
- Base62 encoding
[a-zA-Z0-9]: 62^7 ≈ 3.5 trillion combinations - Hash collision: MD5/SHA-256 lấy 7 ký tự, append counter nếu collision
- Data model:
url_mapping(short_url PK, original_url, user_id, created_at, expires_at)
🎯 Scenario Choice
SQL vs NoSQL cho URL Mapping
SQL (PostgreSQL): ACID đảm bảo uniqueness, mature indexing, vertical scaling giới hạn.
NoSQL (DynamoDB): Horizontal scaling tự nhiên, eventual consistency có thể gây duplicate tạm.
💡 Với read/write 10:1 và yêu cầu strong consistency cho uniqueness, SQL + read replica phổ biến. NoSQL phù hợp khi write QPS > 100K.
Trắc nghiệm
🧠 Quiz
Câu 1: Tại sao Base62 được ưu tiên hơn Base64?
- [ ] A) Base62 tạo short URL ngắn hơn
- [x] B) Base62 chỉ dùng ký tự URL-safe, tránh
+và/gây conflict - [ ] C) Base62 có collision rate thấp hơn
- [ ] D) Base64 không thể mã hóa số nguyên
💡 Base64 chứa
+,/,=cần URL encoding. Base62 dùng[a-zA-Z0-9], hoàn toàn URL-safe.
🧠 Quiz
Câu 2: Giải pháp hiệu quả nhất khi hash collision?
- [ ] A) Tăng độ dài short URL lên 10 ký tự
- [ ] B) Dùng random string thay vì hash
- [x] C) Append counter vào input rồi hash lại cho đến khi không collision
- [ ] D) Sử dụng UUID thay cho hash
💡 Rehashing giữ tính deterministic. Với 62^7 combinations, collision cực hiếm nên overhead thấp.
🧠 Quiz
Câu 3: Distributed ID generator (Snowflake) có ưu điểm gì so với hash?
- [ ] A) Tạo URL ngắn hơn
- [ ] B) Không cần database kiểm tra uniqueness
- [x] C) Đảm bảo uniqueness không cần collision check, hỗ trợ horizontal scaling
- [ ] D) Tăng tốc redirect vì ID là số nguyên
💡 Snowflake tạo unique ID từ timestamp + worker ID + sequence. Mỗi worker độc lập, không cần coordination.