Skip to content

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

MetricGiá 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 +/ 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.