บทที่ 07 · Unique ID Generator

ออกแบบ Unique ID Generator

บทนี้กล่าวถึงความท้าทายในการออกแบบ Unique ID Generator สำหรับ Distributed Systems โดยเน้นการสร้าง IDs ที่ไม่ซ้ำกันและเรียงลำดับตามวันที่ได้

บทนำ

การออกแบบ Unique ID Generator สำหรับ Distributed Systems เป็นความท้าทายที่สำคัญ Auto-increment Keys แบบดั้งเดิมไม่เหมาะสมในสภาพแวดล้อมแบบ Distributed เนื่องจากปัญหาการ Synchronize ความสนใจอยู่ที่การสร้าง IDs ที่ไม่ซ้ำกันและเรียงลำดับตามวันที่ขนาด 64-bit

ข้อกำหนด

ตัวเลือก High-Level Design

1. Multi-Master Replication

ใช้ Database auto_increment พร้อม Step Increments (เช่น +k สำหรับ k Servers)

ข้อเสีย
  • ยากที่จะขยายข้าม Data Centers
  • IDs ไม่เพิ่มตามเวลาอย่างสม่ำเสมอ
  • ปัญหาการ Scaling เมื่อเพิ่ม/ลบ Servers

2. UUID (Universally Unique Identifier)

สร้าง 128-bit Unique Identifiers อย่างอิสระบนแต่ละ Server

ข้อดี
  • ไม่ต้องประสานงานระหว่าง Servers
  • ขยายได้ง่าย
ข้อเสีย
  • เกิน 64-bit
  • IDs ไม่เรียงลำดับตามเวลา

3. Ticket Server

ใช้ Centralized Database Server เพื่อเพิ่มและกำหนด IDs

ข้อดี
  • ง่ายต่อการ Implement สำหรับระบบขนาดเล็ก
  • สร้าง IDs ที่เป็นตัวเลข
ข้อเสีย
  • Single Point of Failure
  • ปัญหาการ Synchronize ในการตั้งค่าหลาย Servers

แนวทาง Twitter Snowflake

Snowflake ID Breakdown (64 bits)

1 bit
Sign
41 bits
Timestamp
5 bits
Datacenter
5 bits
Machine
12 bits
Sequence
0
milliseconds
since epoch
0-31
0-31
0-4095

ส่วนประกอบ

ข้อดี

  • Scalability: รองรับ 10,000+ IDs ต่อวินาทีข้ามหลาย Servers
  • Time-Order: รับประกัน IDs เรียงลำดับตามเวลา
  • Decentralization: ไม่มี Single Point of Failure

ข้อพิจารณาเพิ่มเติม

1. Clock Synchronization

ความท้าทาย: ID Generation ตั้งสมมติฐานว่า Clocks ถูก Synchronize ข้าม Servers

วิธีแก้ไข: ใช้ Network Time Protocol (NTP) เพื่อลด Drift

2. Section Length Tuning

ปรับขนาด Sections (เช่น Bits Sequence น้อยลง, Bits Timestamp มากขึ้น) ตาม Use Case

3. High Availability

ID Generators เป็น Mission-critical และต้อง Fault-tolerant

เนื้อหานี้อ้างอิงจาก ByteByteGo - System Design Interview - An Insider's Guide