Thiết kế dịch vụ rút gọn URL
Đáp án mẫu
Yêu cầu. Tạo link ngắn cho một URL dài, chuyển hướng nhanh, tuỳ chọn cho phép alias tuỳ chỉnh và thời hạn. Lượng đọc vượt xa lượng ghi, nên giả định tỷ lệ đọc rất cao, như 100 trên 1.
API. POST /links với URL dài trả về mã ngắn. GET /{code} phản hồi bằng chuyển hướng HTTP 301 hoặc 302. 302 cho phép đếm từng lượt nhấp, còn 301 có thể bị trình duyệt cache.
Sinh mã. Dùng chuỗi base62 gồm 7 ký tự, cho khoảng 3,5 nghìn tỷ tổ hợp. Các lựa chọn: mã hoá một bộ đếm hoặc ID duy nhất từ bộ sinh phân tán (không đụng độ nhưng mã đoán được nếu không xáo trộn), hoặc băm cộng kiểm tra đụng độ.
Lưu trữ. Một kho key-value theo khoá là mã, lưu URL dài, chủ sở hữu, thời điểm tạo và hạn dùng. Nó mở rộng ngang bằng cách shard theo mã.
Đường đọc. Đặt cache (ví dụ Redis) và CDN phía trước, vì các link nóng chiếm phần lớn lưu lượng.
Bổ sung. Giới hạn tốc độ, kiểm tra lạm dụng và mã độc, và pipeline phân tích bất đồng bộ để đếm lượt nhấp.
Ý chính
- Tải thiên về đọc: cache và CDN trên đường chuyển hướng
- Mã base62 gồm 7 ký tự cho khoảng 3,5 nghìn tỷ tổ hợp
- Kho key-value được shard theo mã
- 301 so với 302 là đánh đổi giữa cache và phân tích lượt nhấp
Câu hỏi nối tiếp thường gặp
- Bạn sinh mã duy nhất trên nhiều máy chủ mà không đụng độ thế nào?
- Bạn xử lý link hết hạn và lạm dụng thế nào?
Lỗi thường gặp
- Dùng hash bị cắt ngắn mà không kiểm tra đụng độ
- Bỏ qua mẫu tải thiên về đọc và không cache