บทนี้กล่าวถึงการออกแบบบริการย่อ URL เช่น TinyURL เป้าหมายหลักรวมถึงการย่อ URL การ Redirect และความสามารถในการขยายสูงเพื่อรองรับปริมาณ Traffic ขนาดใหญ่
บทนำ
บทนี้กล่าวถึงการออกแบบบริการย่อ URL เช่น TinyURL ระบบมีเป้าหมายหลัก:
- URL Shortening - ย่อ URL
- Redirecting - Redirect ไปยัง URL เดิม
- High Scalability - รองรับ Traffic ขนาดใหญ่
ข้อกำหนด
- URL ที่ย่อแล้วต้องไม่ซ้ำกันและสั้นที่สุดเท่าที่เป็นไปได้
- รองรับ 100 ล้าน URL ต่อวัน
- อัตราส่วน Read:Write = 10:1
API Endpoints
POST api/v1/data/shorten
Parameters: {longUrl: longURLString}
Returns: shortURL
GET api/v1/shortUrl
Returns: longURL สำหรับ redirect
URL Redirection
- 301 Redirect: URL ที่ร้องขอถูก "ย้าย" ถาวรไปยัง long URL Browser Cache Response และ Requests ต่อไปจะไม่ถูกส่งไปยังบริการย่อ URL
- 302 Redirect: ชั่วคราว; มีประโยชน์สำหรับ Analytics เช่นการติดตาม Clicks
Data Model
จัดเก็บ <shortURL, longURL> mappings ใน Relational Database
id(primary key)shortURLlongURL
Hash Function
1. Base 62 Conversion
เข้ารหัสตัวเลขโดยใช้ตัวอักษร [0-9, a-z, A-Z] ให้ 62 ตัวอักษรที่เป็นไปได้
- Base Conversion เป็นอีกวิธีหนึ่งที่ใช้กันทั่วไปสำหรับ URL Shorteners
- Unique ID สามารถกำหนดให้ short URL และ ID สามารถแปลงเป็น Base 62 เพื่อรับ Short URL
- URL 7 ตัวอักษรรองรับสูงสุด 3.5 ล้านล้าน URLs ที่ไม่ซ้ำกัน
2. Hash + Collision Resolution
ใช้ Hash Functions เช่น CRC32, MD5, หรือ SHA-1
- วิธีหนึ่งคือเก็บ 7 ตัวอักษรแรกของ Hash Value
- แก้ไข Collisions ด้วย Bloom Filters สำหรับ Lookup ที่มีประสิทธิภาพ
เปรียบเทียบวิธีการ
Hash + Collision Resolution
- ความยาว Short URL คงที่
- ไม่ต้องการ Unique ID Generator
- Collision เป็นไปได้และต้องการการแก้ไข
Base 62 Conversion
- ความยาวไม่คงที่และเพิ่มขึ้นตาม ID
- ต้องการ Unique ID Generator
- Collision ไม่เป็นไปได้
- หา Short URL ถัดไปได้ง่ายถ้า ID เพิ่มทีละ 1
URL Shortening Flow
- ตรวจสอบว่า
longURLมีอยู่ใน Database หรือไม่ - หากพบ ส่งคืน
shortURLที่มีอยู่ - หากไม่:
- สร้าง Unique ID โดยใช้ Distributed ID Generator
- แปลง ID เป็น
shortURLโดยใช้ Base 62 - จัดเก็บ
<id, shortURL, longURL>mapping ใน Database
URL Redirecting Flow
- ผู้ใช้คลิก
shortURL - Query
<shortURL, longURL>mapping:- ตรวจสอบ Cache ก่อนเพื่อเข้าถึงเร็วขึ้น
- หากไม่อยู่ใน Cache สืบค้น Database
- Redirect ผู้ใช้ไปยัง
longURL
ข้อพิจารณาเพิ่มเติม
Rate Limiter
ป้องกันการใช้งานโดยการกำหนด Limits ต่อ IP
Scalability
- Web Tier: Stateless ขยายได้โดยเพิ่ม/ลบ Web Servers
- Database Tier: ใช้ Replication และ Sharding
Analytics
รวบรวมข้อมูลเช่น Click Rates, Source, Timestamps
เนื้อหานี้อ้างอิงจาก ByteByteGo - System Design Interview - An Insider's Guide